一、组合模式简介(Brief Introduction)
组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。二、解决的问题(What To Solve)
解决整合与部分可以被一致对待问题。三、组合模式分析(Analysis)
Component:抽象的组件对象,为组合中的对象声明接口,让客户端可以通过这个接口来访问和管理整个对象结构,可以在里面为定义的功能提供缺省的实现
Leaf:叶子节点对象,定义和实现叶子对象的行为,不再包含其他的子节点对象
Composite:组合对象,通常会存储子组件,定义包含子组件的那些组件的行为,并实现在组件接口中定义的与子组件有关的操作
Client:客户端,通过组件接口来操作组合结构里面的组件对象
四、实例代码
1、Component抽象类
public abstract class Component {
public abstract void someOperation(String str);
public void addChild(Component child){
throw new UnsupportedOperationException("对象不支持这个功能");
}
public void removeChild(Component child) {
throw new UnsupportedOperationException("对象不支持这个功能");
}
public Component getChildren(int index) {
throw new UnsupportedOperationException("对象不支持这个功能");
}
}
2、Composite组合对象
public class Composite extends Component {
private List<Component> components = null;
private String name = "";
public Composite(String name){
this.name = name;
}
public void someOperation(String str) {
System.out.println(str+"+"+this.name);
//如果还包含有子组件,那么就输出这些子组件对象
if(this.components!=null){
//然后添加一个空格,表示向后缩进一个空格
str+=" ";
//输出当前对象的子对象了
for(Component c : components){
//递归输出每个子对象
c.someOperation(str);
}
}
}
public void addChild(Component child){
if (components == null) {
components = new ArrayList<Component>();
}
components.add(child);
}
}
3、Leaf叶子节点对象
public class Leaf extends Component {
private String name = "";
public Leaf(String name){
this.name = name;
}
public void someOperation(String str) {
System.out.println(str+"-"+name);
}
}
4、客户端调用
public class Client {
public static void main(String[] args) {
Component root = new Composite("电脑");
Component c1 = new Composite("台式机");
Component c2 = new Composite("笔记本");
Component leaf1 = new Leaf("联想台式机");
Component leaf2 = new Leaf("戴尔台式机");
Component leaf3 = new Leaf("联想笔记本");
Component leaf4 = new Leaf("戴尔笔记本");
Component leaf5 = new Leaf("华硕笔记本");
root.addChild(c1);
root.addChild(c2);
c1.addChild(leaf1);
c1.addChild(leaf2);
c2.addChild(leaf3);
c2.addChild(leaf4);
c2.addChild(leaf5);
root.someOperation("|");
}
}
运行结果: