架构师训练营第 3 周作业

发布于: 2020 年 06 月 23 日

作业1:

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

JVM启动即加载类,唯一的缺点是不适用会占用内存。

作业2:

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

组合模式(Composite Pattern):将对象组合成树形结构以表示“部分-整理”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。

组合模式的优点

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

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

组合模式的缺点

组合模式有一个非常明显的缺点,直接使用了实现类,这在面向接口编程上是很不恰当的,与依赖倒置原则冲突。

组合模式的使用场景

  • 维护和展示部分—整体关系的场景,如树形菜单、文件和文件夹管理。

  • 从一个整体中能够独立出部分模块或功能的场景。

本次作业的示例代码如下:

/**
* 父类
*/
public abstract class Component {
private String name;
private Component parent;
public Component(String name) {
this.name = name;
}
public void setParent(Component parent) {
this.parent = parent;
}
public Component getParent() {
return this.parent;
}
public String getName() {
return name;
}
}

/**
* 具体组件类,相当于叶子
*/
public class ConcreteComponent extends Component {
public ConcreteComponent(String name) {
super(name);
}
}

/**
* 区域块实现类
*/
public class Area extends Component {
private List<Component> subComponents = new ArrayList<>();
public Area(String name) {
super(name);
}
public void addSubComponent(Component comp){
comp.setParent(this);
subComponents.add(comp);
}
public List<Component> getSubComponents(){
return this.subComponents;
}
}

public class Client {
public static void main(String[] args) {
Area window = buildArea();
display(window);
}
public static Area buildArea() {
Area window = new Area("WINDOW窗口");
Component logo = new ConcreteComponent("LOGO图片");
Component loginButton = new ConcreteComponent("登录");
Component regButton = new ConcreteComponent("注册");
Area frame = new Area("FRAME1");
window.addSubComponent(logo);
window.addSubComponent(loginButton);
window.addSubComponent(regButton);
window.addSubComponent(frame);
Component nameLable = new ConcreteComponent("用户名");
Component nameTextBox = new ConcreteComponent("文本框");
Component passwdLable = new ConcreteComponent("密码");
Component passwdTextBox = new ConcreteComponent("密码框");
Component nameCheckBox = new ConcreteComponent("复选框");
Component remTextBox = new ConcreteComponent("记住用户名");
Component passwdLinkLable = new ConcreteComponent("忘记密码");
frame.addSubComponent(nameLable);
frame.addSubComponent(nameTextBox);
frame.addSubComponent(passwdLable);
frame.addSubComponent(passwdTextBox);
frame.addSubComponent(nameCheckBox);
frame.addSubComponent(remTextBox);
frame.addSubComponent(passwdLinkLable);
return window;
}
private static void display(Area window) {
System.out.println(window.getName());
for (Component c : window.getSubComponents()) {
if (c instanceof Area) {
display((Area) c);
} else {
System.out.println(c.getName());
}
}
}
}

结果如下:

WINDOW窗口
LOGO图片
登录
注册
FRAME1
用户名
文本框
密码
密码框
复选框
记住用户名
忘记密码

发布于: 2020 年 06 月 23 日 阅读数: 16
用户头像

李明建

关注

还未添加个人签名 2012.03.11 加入

还未添加个人简介

评论

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