架构师 0 期 | 组合模式使用
发布于: 2020 年 06 月 24 日
作业一:
手写单例模式,拍照上传。
作业二:
请用组合设计模式编写程序,打印输出图 1 的窗口,窗口组件的树结构如图 2 所示,打印输出示例参考图
代码实现目录图
定义一个接口
// 所有组件都需要实现该接口,其中定义打印方法public interface Component { public void print();}
实现组件抽象类
// 实现构造方法,传入类的名字// 重载打印方法,实现打印功能// 基础抽象类public abstract class BaseComponent implements Component { private String name; public BaseComponent(String name) { this.name = name; } @Override public void print() { System.out.println(this.name); }}
实现父容器抽象类
// 增加添加组件方法// 重载打印方法,实现循环打印子类功能// 容器抽象类public abstract class Container implements Component { private List<Component> componentList = new ArrayList<Component>(); private String name = null; public Container(String name) { this.name = name; } public void addComponent(Component component) { componentList.add(component); } public void print() { System.out.println(this.name); componentList.forEach(comp -> comp.print()); }}
实现子类实现类
// 实现构造方法,传入名字public class Button extends BaseComponent { public Button(String name) { super(name); }}
public class CheckBox extends BaseComponent { public CheckBox(String name) { super(name); }}
public class Label extends BaseComponent { public Label(String name) { super(name); }}
public class LinkLabel extends BaseComponent { public LinkLabel(String name) { super(name); }}
public class PasswordBox extends BaseComponent { public PasswordBox(String name) { super(name); }}
public class Picture extends BaseComponent { public Picture(String name) { super(name); }}
public class TextBox extends BaseComponent { public TextBox(String name) { super(name); }}
跟节点,需要继承父容器类
// 根节点public class WinForm extends Container { public WinForm(String name) { super(name); }}
public class Frame extends Container { public Frame(String name) { super(name); }}
测试方法
构造例子中的组件树
import java.awt.*;public class TestLogin { public static void main(String[] args) { //上层 Container loginPage = new WinForm("WinForm(Window窗口)"); loginPage.addComponent(new Picture("Picture(Logo图片)")); //最下层 loginPage.addComponent(new Button("Button(登录)")); loginPage.addComponent(new Button("Button(注册)")); //中层 Frame frame1 = new Frame("Frame(Frame1)"); loginPage.addComponent(frame1); frame1.addComponent(new Label("Label(用户名)")); frame1.addComponent(new TextBox("TextBox(文本框)")); frame1.addComponent(new Label("Label(密码)")); frame1.addComponent(new PasswordBox("PasswordBox(密码框)")); frame1.addComponent(new CheckBox("CheckBox(复选框)")); frame1.addComponent(new TextBox("TextBox(记住用户名)")); frame1.addComponent(new LinkLabel("LinkLabel(忘记密码)")); //打印 loginPage.print(); }}
最终打印结果
划线
评论
复制
发布于: 2020 年 06 月 24 日阅读数: 53
版权声明: 本文为 InfoQ 作者【刁架构】的原创文章。
原文链接:【http://xie.infoq.cn/article/5b71a69e2ef161e7d6c9f19e8】。文章转载请联系作者。
刁架构
关注
叫我刁架构 2017.10.25 加入
预备备网红首席架构师,移动端开发者,边缘设计支持者。
评论