写点什么

设计模式的艺术 第十一章组合设计模式练习(开发一个界面控件库。界面控件分为两大类:一类是单元控件,例如按钮、文本框等;另一类是容器控件,例如窗体、中间面板等。试用组合模式设计该界面控件库)

作者:代廉洁
  • 2022 年 9 月 03 日
    浙江
  • 本文字数:1693 字

    阅读完需:约 6 分钟

Sunny 软件公司欲开发一个界面控件库。界面控件分为两大类:一类是单元控件,例如按钮、文本框等;另一类是容器控件,例如窗体、中间面板等。试用组合模式设计该界面控件库。


一、类结构图



抽象构件类:设计为名称为 Component 的抽象类,面向抽象构件类编程,包含抽象方法 add(Component component)、抽象方法 remove(Component component)、抽象方法 getChild(int i)、抽象方法 display();

容器构件类:设计为抽象构件类 Component 的子类,设计为名称为 Container 的具体类,面向抽象构件类编程,持有一个抽象构件类 list 的引用,实现抽象构件类 Component 的抽象方法 add(Component component)、抽象方法 remove(Component component)、抽象方法 getChild(int i)、抽象方法 display();

叶子构件类:设计为抽象构件类 Component 的子类,包括具体叶子构件类 Button、具体叶子构件类 TextBox,分别实现抽象构件类 Component 的抽象方法 display(),抽象方法 add(Component component)、remove(Component component)、getChild(int i)使用空实现。

二、典型实现代码

抽象组件类:抽象构件类
// 抽象组件类:抽象构件类public abstract class Component {    public abstract void add(Component component);    public abstract void remove(Component component);    public abstract Component getChild(int i);    public abstract void display();}
复制代码


具体容器组件类:具体容器构件类
// 具体容器组件类:具体容器构件类public class Container extends Component {    private String name;    private ArrayList<Component> componentList = new ArrayList<>();
public Container(String name) { this.name = name; }
@Override public void add(Component component) { this.componentList.add(component); }
@Override public void remove(Component component) { this.componentList.remove(component); }
@Override public Component getChild(int i) { return this.componentList.get(i); }
@Override public void display() { for (Component component : this.componentList) { component.display(); } }}
复制代码


具体按钮组件类:具体叶子构件类
// 具体按钮组件类:具体叶子构件类public class Button extends Component {    private String name;
public Button(String name) { this.name = name; }
@Override public void add(Component component) { }
@Override public void remove(Component component) { }
@Override public Component getChild(int i) { return null; }
@Override public void display() { System.out.println("按钮显示:" + this.name); }}
复制代码


具体文本框组件类:具体叶子构件类
// 具体文本框组件类:具体叶子构件类public class TextBox extends Component {    private String name;
public TextBox(String name) { this.name = name; }
@Override public void add(Component component) { }
@Override public void remove(Component component) { }
@Override public Component getChild(int i) { return null; }
@Override public void display() { System.out.println("文本框显示:" + this.name); }}
复制代码


客户端代码:
public class Client {    public static void main(String[] args) {        Component button, textBox, window, pane;
window = new Container("窗体"); pane = new Container("中间面板");
button = new Button("按钮一"); textBox = new TextBox("文本框一");
pane.add(button); pane.add(textBox); window.add(pane);
window.display(); }}
复制代码


编译并运行程序,输出如下结果:
按钮显示:按钮一文本框显示:文本框一
复制代码


发布于: 刚刚阅读数: 6
用户头像

代廉洁

关注

还未添加个人签名 2019.10.15 加入

还未添加个人简介

评论

发布
暂无评论
设计模式的艺术 第十一章组合设计模式练习(开发一个界面控件库。界面控件分为两大类:一类是单元控件,例如按钮、文本框等;另一类是容器控件,例如窗体、中间面板等。试用组合模式设计该界面控件库)_设计模式的艺术_代廉洁_InfoQ写作社区