架构师训练营 week03 作业
1、请在草稿纸上手写一个单例模式的实现代码,拍照提交作业。
饿汉模式:
懒汉模式:
2、请用组合设计模式编写程序,打印输出图 1 的窗口,窗口组件的树结构如图 2 所示,打印输出示例参考图 3。
可以考虑维护一个控件列表,然后运用组合模式实现该程序。具体代码如下:
1、先定义一个控件接口:
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); }
2、定义控件基类,抽象出常用方法(这里是模板模式)
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(); } }
3、定义基本控件类
class WinForm extends BaseControl { } class Button extends BaseControl { } class CheckBox extends BaseControl { } class Frame extends BaseControl { } class Label extends BaseControl { } class LinkLabel extends BaseControl { } class PassowrdBox extends BaseControl { } class Picture extends BaseControl { } class TextBox extends BaseControl { }
4、main方法
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)); } }
5、执行结果
print 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(忘记密码)
本次作业个人没有完全理解,参考了这位水边同学的做法
评论