写点什么

【第三周】架构师训练营作业

用户头像
星星
关注
发布于: 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();
}
}



用户头像

星星

关注

还未添加个人签名 2018.08.06 加入

还未添加个人简介

评论

发布
暂无评论
【第三周】架构师训练营作业