构架师训练营 - 第 3 周命题作业
发布于: 2020 年 06 月 24 日
1 请手撕一个鬼子看看
请在草稿纸上手写一个单例模式的实现代码(拍照提交作业)
各位看官,您没看错,今天的作业第一题就是手撕一个鬼子,来吧:
撕完了,原谅我,为了避免手撕带来的痛苦把这个类作得没心没肺,也没反抗行为!
2 请用组合模式编写一个程序
要求:打印输出图1的窗口,窗口组件的树结构如图2所示。打印输出示例参考图3.
直接上代码吧
BaseCtrl.jave
package cc.dawn.homework.winform.ctrl;import java.io.PrintStream;public abstract class BaseCtrl { public BaseCtrl(String name) { this.name = name; } /** * 标签名 */ private String name; /** * 获取类型 * @return */ public String getType(){ return this.getClass().getSimpleName(); } public String getName() { return name; } public void setName(String name) { this.name = name; } public void print(PrintStream stream){ stream.println(String.format("print %s(%s)",getType(), getName())); }}
2 Container 容器基类
package cc.dawn.homework.winform.container;import cc.dawn.homework.winform.ctrl.BaseCtrl;import cc.dawn.homework.winform.CtrlFactory;import java.io.PrintStream;import java.util.ArrayList;import java.util.List;public class Container extends BaseCtrl { /** * 子节点 */ private List<BaseCtrl> children; public Container(String label) { super(label); this.children = new ArrayList<>(); } public <T extends BaseCtrl> Container addChild(Class<T> instClass,String name){ this.children.add(CtrlFactory.create(instClass,name)); return this; } public <T extends BaseCtrl> Container addChild(BaseCtrl child){ this.children.add(child); return this; } public List<BaseCtrl> getChildren() { return children; } public void setChildren(List<BaseCtrl> children) { this.children = children; } @Override public void print(PrintStream stream) { super.print(stream); if (children != null) { for (BaseCtrl baseCtrl : children) { baseCtrl.print(stream); } } }}
然后就是让Winform、Frame类继承Container容器类,Button、CheckBox、Lable、LinkLable等继承BaseCtrl,篇幅有限,仅以Winform、Button代码为例:
WinForm.java
package cc.dawn.homework.winform.container;public class WinForm extends Container { public WinForm(String label) { super(label); }}
Button.java
package cc.dawn.homework.winform.ctrl;public class Button extends BaseCtrl { public Button(String label) { super(label); }}
为了方便测试我决定投资开个工厂
CtrlFactory
package cc.dawn.homework.winform;import cc.dawn.homework.winform.ctrl.BaseCtrl;import java.lang.reflect.Constructor; public class CtrlFactory { public static <T extends BaseCtrl> T create(Class<T> instClass, String name) { try { Constructor<T> constructor = instClass.getConstructor(String.class); return constructor.newInstance(name); } catch (Exception e) { throw new RuntimeException(e); } }}
TestWinForm
package cc.dawn.homework.winform.test;import cc.dawn.homework.winform.CtrlFactory;import cc.dawn.homework.winform.container.Frame;import cc.dawn.homework.winform.container.WinForm;import cc.dawn.homework.winform.ctrl.*;public class TestWinForm { public static void main(String[] args) { CtrlFactory.create(WinForm.class, "WINDOW窗口") .addChild(Picture.class, "LOGO图片") .addChild(Button.class, "登录") .addChild(Button.class, "注册") .addChild( CtrlFactory.create(Frame.class, "FRAME1") .addChild(Lable.class, "用户名") .addChild(TextBox.class, "文本框") .addChild(Lable.class, "密码") .addChild(PasswordBox.class, "密码框") .addChild(CheckBox.class, "复选框") .addChild(TextBox.class, "记住用户名") .addChild(LinkLable.class, "忘记密码") ).print(System.out); ; }}
你们要的结果来了:
划线
评论
复制
发布于: 2020 年 06 月 24 日阅读数: 56
Dawn
关注
还未添加个人签名 2018.07.04 加入
还未添加个人简介
评论