【第三周】架构师训练营作业
发布于: 2020 年 06 月 24 日
1. 请在草稿纸上手写一个单例模式的实现代码,拍照提交作业。
2. 请用组合设计模式编写程序,打印输出图 1 的窗口,窗口组件的树结构如图 2 所示,打印输出示例参考图 3。
作答:
1. 类图:
定义一个Component接口,Composite和Leaf这个接口。
Composite表示组合节点,可以包含其他节点的节点,Leaf表示叶子节点,叶子节点不能包含其他节点了。感觉这样会违反LSP,但是也没有想到更好的实现。
Composite有一个Component类型的容器成员变量,就是它支持了Composite可以包含其他节点的能力。
ComponentType其实是个枚举,表示节点的类型。不属于组合模式的类。
2. 代码
2.1 Component接口
public interface Component { void add(Component component); void print();}
2.2 ComponentType枚举类
public enum ComponentType { WinForm,Picture,Button,Frame,Lable,TextBox,PasswordBox,CheckBox,LinkLable}
2.3 Composite组合节点类
public class Composite implements Component { private List<Component> components; private String name; private ComponentType type; public Composite(String name, ComponentType type) { this.components = new ArrayList<Component>(); this.name = name; this.type = type; } @Override public void add(Component component) { components.add(component); } @Override public void print() { System.out.println(String.format("print %s(%s)",type.name(),name)); for (Component component:components) { component.print(); } }}
2.4 Leaf叶子节点类
public class Leaf implements Component { private String name; private ComponentType type; public Leaf(String name, ComponentType type) { this.name = name; this.type = type; } @Override public void add(Component component) { throw new UnsupportedOperationException(); } @Override public void print() { System.out.println(String.format("print %s(%s)",type.name(),name)); }}
2.5 Client应用程序类
public class Client { public static void main(String[] args) { Component winForm=new Composite("WINDOW窗口",ComponentType.WinForm); Component picture=new Leaf("LOGO窗口",ComponentType.Picture); Component button1=new Leaf("登录",ComponentType.Button); Component button2=new Leaf("注册",ComponentType.Button); Component frame=new Composite("FRAME1",ComponentType.Frame); Component lable1=new Leaf("用户名",ComponentType.Lable); Component textBox1=new Leaf("文本框",ComponentType.TextBox); Component lable2=new Leaf("密码",ComponentType.Lable); Component passwordBox=new Leaf("密码框",ComponentType.PasswordBox);; Component checkBox=new Leaf("复选框",ComponentType.CheckBox); Component textBox2=new Leaf("记住用户名",ComponentType.TextBox); Component linkLable=new Leaf("忘记密码",ComponentType.LinkLable); frame.add(lable1); frame.add(textBox1); frame.add(lable2); frame.add(passwordBox); frame.add(checkBox); frame.add(textBox2); frame.add(linkLable); winForm.add(picture); winForm.add(button1); winForm.add(button2); winForm.add(frame); winForm.print(); }}
划线
评论
复制
发布于: 2020 年 06 月 24 日阅读数: 43
星星
关注
还未添加个人签名 2018.08.06 加入
还未添加个人简介
评论