架构师训练营 - 命题作业 第 3 周
发布于: 2020 年 06 月 22 日
1、请在草稿纸上手写一个单例模式的实现代码,拍照提交作业。
答:写了饿汉和懒汉2种方式,如图:
请用组合设计模式编写程序,打印输出图 1 的窗口,窗口组件的树结构如图 2 所示,打印输出示例参考图 3。
答:在开发过程中,除了组合模式,还综合使用了模板模式,提取基类方法,提取泛型实例化方法,编译测试通过。
a、定义接口 Control
package cn.beinet;import java.util.List;public interface Control { /** * 输出控件信息 */ void print(); /** * 返回当前控件名 * * @return 控件名 */ String getName(); /** * 设置当前控件名 */ void setName(String name); /** * 返回子控件清单,不需要子控件时,要重写抛出异常 * * @return 控件清单 */ List<Control> getChilds(); /** * 添加子结点,不需要子控件时,要重写抛出异常 * * @param control 结点 * @return 返回子结点个数 */ int addChild(Control control);}
b、定义基类 BaseControl,抽取出通用模板方法
package cn.beinet;import java.util.ArrayList;import java.util.List;public abstract class BaseControl implements Control { private List<Control> childs = new ArrayList<>(); private String name; @Override public String getName() { return name; } @Override public void setName(String name) { this.name = name; } @Override public List<Control> getChilds() { return childs; } @Override public void print() { System.out.println(String.format("print %s(%s)", this.getClass().getSimpleName(), getName())); List<Control> childs = getChilds(); if (childs != null) { for (Control ctl : childs) { ctl.print(); } } } @Override public int addChild(Control control) { List<Control> childs = getChilds(); if (childs == null) { return 0; } if (control != null) { childs.add(control); } return childs.size(); }}
c、定义9个具体的控件类,都只有类定义,不需要具体代码:
WinForm、Button、CheckBox、Frame、Label、LinkLabel、PassowrdBox、Picture、TextBox
package cn.beinet;public class WinForm extends BaseControl {}public class Button extends BaseControl {}public class CheckBox extends BaseControl {}public class Frame extends BaseControl {}public class Label extends BaseControl {}public class LinkLabel extends BaseControl {}public class PassowrdBox extends BaseControl {}public class Picture extends BaseControl {}public class TextBox extends BaseControl {}
d、定义完毕,下面是main主调方法:
package cn.beinet;public class Main { public static void main(String[] args) throws IllegalAccessException, InstantiationException { // 声明主窗体 Control mainForm = new WinForm(); mainForm.setName("WINDOW窗口"); // 添加子控件 addChilds(mainForm); // 绘画整个窗体 mainForm.print(); } static <T> Control createChild(String name, Class<T> clasz) throws IllegalAccessException, InstantiationException { Control child = (Control) clasz.newInstance(); child.setName(name); return child; } static void addChilds(Control mainForm) throws InstantiationException, IllegalAccessException { mainForm.addChild(createChild("LOGO图片", Picture.class)); mainForm.addChild(createChild("登录", Button.class)); mainForm.addChild(createChild("注册", Button.class)); Control frame = createChild("FRAME1", Frame.class); mainForm.addChild(frame); frame.addChild(createChild("用户名", Label.class)); frame.addChild(createChild("文本框", TextBox.class)); frame.addChild(createChild("密码", Label.class)); frame.addChild(createChild("密码框", PasswordBox.class)); frame.addChild(createChild("复选框", CheckBox.class)); frame.addChild(createChild("记住用户名", TextBox.class)); frame.addChild(createChild("忘记密码", LinkLabel.class)); }}
e、执行结果如下:
"C:\Program Files\Java\jdk1.8.0_201\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.2\lib\idea_rt.jar=52379:C:\Program Files\JetBrains\IntelliJ IDEA 2019.2\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_201\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\rt.jar;D:\work\JavaProject\WinDeom\out\production\WinDeom" cn.beinet.Mainprint WinForm(WINDOW窗口)print Picture(LOGO图片)print Button(登录)print Button(注册)print Frame(FRAME1)print Label(用户名)print TextBox(文本框)print Label(密码)print PasswordBox(密码框)print CheckBox(复选框)print TextBox(记住用户名)print LinkLabel(忘记密码)Process finished with exit code 0
划线
评论
复制
发布于: 2020 年 06 月 22 日 阅读数: 98
版权声明: 本文为 InfoQ 作者【水边】的原创文章。
原文链接:【http://xie.infoq.cn/article/a088f322afd6c487479d243db】。文章转载请联系作者。
水边
关注
还未添加个人签名 2019.04.14 加入
还未添加个人简介
评论