架构师训练营 -W3- 作业一

发布于: 2020 年 06 月 23 日

一 单例模式

请在草稿纸上手写一个单例模式的实现代码,拍照提交作业。

二 组合模式

请用组合设计模式编写程序,打印输出图 1 的窗口,窗口组件的树结构如图 2 所示,打印输出示例参考图 3。

组合模式

在 GoF 的《设计模式》一书中,组合模式是这样定义的:

Compose objects into tree structure to represent part-whole hierarchies.Composite lets client treat individual objects and compositions of objects uniformly.

翻译成中文就是:将一组对象组织(Compose)成树形结构,以表示一种“部分 - 整体”的层次结构。组合让客户端(在很多设计模式书籍中,“客户端”代指代码的使用者。)可以统一单个对象和组合对象的处理逻辑。

类图

右侧隐藏的类与Picture类 类似

代码

package composite;
public abstract class Component {
protected String name;
public abstract void printName();
public Component(String name) {
this.name = name;
}
public abstract String getName();
}

package composite;
import java.util.*;
public class WinForm extends Component {
public static List<Component> subComponents = new ArrayList<>();
@Override
public void printName() {
System.out.println("print WinForm(" + this.getName() + ")");
if(subComponents.size() > 0) {
for(Component subComponent : subComponents) {
subComponent.printName();
}
}
}
public WinForm(String name) {
super(name);
}
@Override
public String getName() {
return name;
}
public void addSubComponents(Component component) {
subComponents.add(component);
}
}

Frame类与WinForm类 类似

package composite;
public class Picture extends Component {
public Picture(String name) {
super(name);
}
@Override
public void printName() {
System.out.println("print LinkLable(" + this.getName() + ")");
}
@Override
public String getName() {
return name;
}
}

Button、CheckBox等其他类与Picture类 类似

main函数:

public class Demo {
public static void main(String[] args) {
WinForm winForm = new WinForm("WINDOW窗口");
Picture picture = new Picture("LOGO图片");
Button button1 = new Button("登录");
Button button2 = new Button("注册");
Frame frame = new Frame("FRAME1");
winForm.addSubComponents(picture);
winForm.addSubComponents(button1);
winForm.addSubComponents(button2);
winForm.addSubComponents(frame);
Lable lable1 = new Lable("用户名");
TextBox textBox1 = new TextBox("文本框");
Lable lable2 = new Lable("密码");
PasswordBox passwordBox = new PasswordBox("密码框");
CheckBox checkBox = new CheckBox("复选框");
TextBox textBox2 = new TextBox("记住用户名");
LinkLable linkLable = new LinkLable("忘记密码");
frame.addSubComponents(lable1);
frame.addSubComponents(textBox1);
frame.addSubComponents(lable2);
frame.addSubComponents(passwordBox);
frame.addSubComponents(checkBox);
frame.addSubComponents(textBox2);
frame.addSubComponents(linkLable);
winForm.printName();
}
}

输出

print WinForm(WINDOW窗口)
print LinkLable(LOGO图片)
print Button(登录)
print Button(注册)
print Frame(FRAME1)
print Lable(用户名)
print LinkLable(文本框)
print Lable(密码)
print LinkLable(密码框)
print CheckBox(复选框)
print LinkLable(记住用户名)
print LinkLable(忘记密码)

组合模式的应用

优点

高层模块调用简单

一棵树形机构中的所有节点都是Component,局部和整体对调用者来说没有任何区别,也就是说,高层模块不必关心自己处理的是单个对象还是整个组合结构,简化了高层模块的代码。

节点自由增加

使用了组合模式后,我们可以看看,如果想增加一个树枝节点、树叶节点是不是都很容易呀,只要找到它的父节点就成,非常容易扩展,符合开闭原则,对以后的维护非常有利。

缺点

组合模式有一个非常明显的缺点,看到我们在场景类中的定义,提到树叶和树枝使用时的定义了吗?直接使用了实现类!这在面向接口编程上是很不恰当的,与依赖倒置原则冲突,读者在使用的时候要考虑清楚,它限制了你接口的影响范围。

用户头像

柳旭

关注

复杂的东西简单讲,简单的东西深刻讲。 2018.08.21 加入

已昏懒人

评论

发布
暂无评论
架构师训练营-W3-作业一