架构师训练营 week03 作业
发布于: 2020 年 07 月 01 日
1. 手写一个单例模式的实现代码
2. 组合设计模式编写程序
用组合设计模式编写程序,打印输出图 1 的窗口,窗口组件的树结构如图 2 所示,打印输出示例参考下图:
组合模式 Composite Pattern
又叫作部分-整体模式,它是一种将对象组合成树状的层次结构的模式,用来表示“部分-整体”的关系,使用户对单个对象和组合对象具有一致的访问性。
包含角色
抽象构件(Component)
叶子构件(Leaf)
Composite(容器构件)
抽象构件:抽象类(或接口),为叶子构件和容器构件对象声明接口,在该角色中可以包含所有子类共有行为的声明和实现。在抽象构件中定义了访问及管理它的子构件的方法,如增加子构件、删除子构件、获取子构件等。这里只定义了onDraw()一个方法打印控件名称;
package com.chenlei.demo.composite;public abstract class Component { public abstract void onDraw();}
容器构件:表示容器节点对象,容器节点包含子节点,其子节点可以是叶子节点,也可以是容器节点,它提供一个集合用于存储子节点,实现了在抽象构件中定义的行为。
package com.chenlei.demo.composite;import java.util.ArrayList;public abstract class Container extends Component{ private String name; private java.util.List<Component> subComponents = new ArrayList<>(); public Container(String name){ this.name = name; } @Override public void onDraw() { System.out.println(String.format("Print %s(%s)",this.getClass().getSimpleName(),name)); subComponents.forEach(Component::onDraw); } public void addComponent(Component subComponent){ subComponents.add(subComponent); };}
叶子构件:组合结构中表示叶子节点对象,叶子节点没有子节点,它实现了在抽象构件中定义的行为。对于那些访问及管理子构件的方法,可以通过异常等方式进行处理,这里叶子构件只实现Component的onDraw()方法。
定义 WinForm、Frame为容器构件。
package com.chenlei.demo.composite;public class WinForm extends Container{ public WinForm(String name) { super(name); }}
package com.chenlei.demo.composite;public class Frame extends Container { public Frame(String name) { super(name); }}
叶子构件:Button、CheckBox、Label、LinkLabel、PassowrdBox、Picture、TextBox。
package com.chenlei.demo.composite;public class Button extends Component{ private String name; public Button(String name){ this.name = name; } @Override public void onDraw() { System.out.println(String.format("Print %s(%s)",this.getClass().getSimpleName(),name)); }}
package com.chenlei.demo.composite;public class CheckBox extends Component{ private String name; public CheckBox(String name) { this.name = name; } @Override public void onDraw() { System.out.println(String.format("Print %s(%s)",this.getClass().getSimpleName(),name)); }}
package com.chenlei.demo.composite;public class Label extends Component { private String name; public Label(String name){ this.name = name; } @Override public void onDraw() { System.out.println(String.format("Print %s(%s)",this.getClass().getSimpleName(),name)); }}
package com.chenlei.demo.composite;public class LinkLabel extends Component{ private String name; public LinkLabel(String name) { this.name = name; } @Override public void onDraw() { System.out.println(String.format("Print %s(%s)",this.getClass().getSimpleName(),name)); }}
package com.chenlei.demo.composite;public class PasswordBox extends Component{ private String name; public PasswordBox(String name) { this.name = name; } @Override public void onDraw() { System.out.println(String.format("Print %s(%s)",this.getClass().getSimpleName(),name)); }}
package com.chenlei.demo.composite;public class PictureBox extends Component{ private String name; public PictureBox(String name){ this.name = name; } @Override public void onDraw() { System.out.println(String.format("Print %s(%s)",this.getClass().getSimpleName(),name)); }}
package com.chenlei.demo.composite;public class TextBox extends Component{ private String name; public TextBox(String name) { this.name = name; } @Override public void onDraw() { System.out.println(String.format("Print %s(%s)",this.getClass().getSimpleName(),name)); }}
测试打印
package com.chenlei.demo;import com.chenlei.demo.composite.*;public class Main { public static void main(String[] args) { WinForm winForm = new WinForm("Window 窗口"); PictureBox pictureBox = new PictureBox("LOGO 图片"); Button loginBtn = new Button("登录"); Button registerBtn = new Button("注册"); winForm.addComponent(pictureBox); winForm.addComponent(loginBtn); winForm.addComponent(registerBtn); Frame frame = new Frame("FRAME1"); Label userNameLbl = new Label("用户名"); TextBox userNameTbx = new TextBox("文本框"); Label passwordLbl = new Label("密码"); PasswordBox passwordBox = new PasswordBox("密码框"); CheckBox checkBox = new CheckBox("复选框"); TextBox rememberMeTbx = new TextBox("记住用户名"); LinkLabel forgetPwdLbl = new LinkLabel("忘记密码"); frame.addComponent(userNameLbl); frame.addComponent(userNameTbx); frame.addComponent(passwordLbl); frame.addComponent(passwordBox); frame.addComponent(checkBox); frame.addComponent(rememberMeTbx); frame.addComponent(forgetPwdLbl); winForm.addComponent(frame); winForm.onDraw(); }}
结果:
划线
评论
复制
发布于: 2020 年 07 月 01 日阅读数: 48
尔东雨田
关注
预备用枪! 2017.12.12 加入
还未添加个人简介
评论