组合模式
练习
请用组合设计模式编写程序,打印输出图 1 的窗口,窗口组件的树结构如图 2 所示,打印输出示例参考图 3。
什么是组合模式
引用维基百科:在软件工程中,组合模式是一种分区设计模式。组合模式描述了一组对象,这些对象被视为同一类型对象的单个实例。组合的目的是将对象“组合”成树形结构以表示部分-整体层次结构。实施这模式可以使客户统一对待各个对象和构图;
do
在上述题目中,根据图2的树形结构可以知道,每个窗口组件都为同一类型对象,一个对象可以包含同类型的多个对象。所以我们可以抽象一个组件对象,定义出具有的功能,然后每个窗口的中的组件就可以去分别实例化,最终按照图中的树形结构组合到一起。
模式中最简定义两个角色即可,一个组件抽象类,一个组件抽象的实现。
/**
* 定义的组件抽象类
*/
public abstract class Component {
public abstract void print();
public abstract void add(Component c);
}
/**
* 用于实例化的组件实现类
*/
public class SubComponent extends Component {
private String subComponentName;
public SubComponent(String name){
subComponentName = name;
}
private List<Component> list;
@Override
public void print(){
if( ObjectUtils.isEmpty(list) ){
System.out.println("I am "+subComponentName+" !");
return;
}
for (Component c:list){
c.print();
}
}
@Override
public void add(Component c){
if( ObjectUtils.isEmpty(list) ) {
list = new ArrayList<>();
}
list.add(c);
}
}
/**
* 测试类
*/
public class TestCombination {
public static void main(String[] args) {
Component winForm = new SubComponent("WinForm窗口");
Component picture = new SubComponent("Picture图片");
Component login = new SubComponent("Button-login-登录");
Component register = new SubComponent("Button-register-注册");
Component frame = new SubComponent("FRAME1");
Component label1 = new SubComponent("Label-用户名");
Component textBox1 = new SubComponent("TextBox-文本框");
Component label2 = new SubComponent("Lable-密码");
Component passwordBox = new SubComponent("PassWordBox-密码框");
Component checkbox = new SubComponent("CheckBox-复选框");
Component textBox2 = new SubComponent("TextBox-记住用户名");
Component linkLabel = new SubComponent("LinkLabel-忘记密码");
frame.add(label1);
frame.add(textBox1);
frame.add(label2);
frame.add(passwordBox);
frame.add(checkbox);
frame.add(textBox2);
frame.add(linkLabel);
winForm.add(picture);
winForm.add(login);
winForm.add(register);
winForm.add(frame);
winForm.print();
}
}
组件模式很简单,实现的功能却很直接,大家可以多思考一下,每种设计模式其实是实际模型的一个抽象。如上文中的例子我们其实还可以组合模式+策略模型+模板方法模式去扩充,就看大家实际情况的应用了。