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