其协作过程是:用户使用Compoment类接口与组合结构中的对象进行交互。如果接受者是一个叶节点,则直接处理请求。如果接受者是Composite,它通常将请求发送给他的字部件,在转发请求之前或者之后可能执行一些辅助操作。
在本例子中,没有什么特殊之处,所不同的是Composite可以容纳Component的子类对象,包括本身。例子本省也比较简单,平淡无味,单却可以在特定的场景能很好的解决特定的问题。
使用组合模式有如下的好处:
l 定义了饱含基本对象和组合对象的类层次结构,基本对象可以被组合成更复杂的组合对象,而这个组合对象有可以被组合。
l 简化客户代码 客户可以一直地使用组合结构和单个对象,通常用户不知道处理的是一个叶节点还是一个组合组件。
l 使得更容易增加新类型的组件, 新定义的Composite或leaf子类自动地与义有的结构和客户代码一起工作,客户程序不需要因为新的Component类而改变。
l 使你的设计变得更一般化。
实现的代码:
Component接口:
package composite;
public interface Component{
public int getSize();
public int getChildNum();
public String getType();
public String getName();
public void add(Component c);
public void remove(Component c);
}
Leaf类:
package composite;
public class Leaf implements Component{
private int size;
private String name;
public Leaf(String aName,int aSize){
size = aSize;
name = aName;
}
public String getName(){
return name;
}
public String getType(){
return "Leaf";
}
public int getSize(){
return size;
}
public int getChildNum(){
return 1;
}
public void add(Component c){
System.err.println("Not supported method!");
}
public void remove(Component c){
System.err.println("Not supported method!");
}
}
Composite类:
package composite;
public class Leaf implements Component{
private int size;
private String name;
public Leaf(String aName,int aSize){
size = aSize;
name = aName;
}
public String getName(){
return name;
}
public String getType(){
return "Leaf";
}
public int getSize(){
return size;
}
public int getChildNum(){
return 1;
}
public void add(Component c){
System.err.println("Not supported method!");
}
public void remove(Component c){
System.err.println("Not supported method!");
}
}
客户端代码:
package composite;
public class Client{
public static void main(String[] args){
Component root = new Composite("root");
Component composite = new Composite("composite");
Component leaf1 = new Leaf("leaf1",20);
Component leaf2 = new Leaf("leaf2",40);
root.add(leaf1);
composite.add(leaf2);
root.add(composite);
String str = "Leaf1's size is "+leaf1.getSize();
str += "\nleaf2's size is " + leaf2.getSize();
str += "\nComposite's size is " + composite.getSize();
str += "\nRoot's size is " + root.getSize();
System.out.println(str);
}
}
总结:组合模式在 解决整体与部分 的问题中 应用比较广泛,一个组合也可以被看作 部分来处理,降低了处理问题的难度。
本文出自 “凌辉” 博客,请务必保留此出处http://tianli.blog.51cto.com/190322/34416