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(); }}
复制代码
编译并运行程序,输出如下结果:
评论