组合模式:将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有统一性。
通俗讲就拿一棵树来说,从树根向上生长,可以将树的结点分为两种,一种是叶子结点,叶子节点下面不可再分,另一种是树杈或者树枝,这种结点可以再往下分为叶子结点。这两种结点的性质不同,也就是属性不一样,在进行操作时也会不一样,而组合模式是将操作对这两种不同的结点具有一致性。这只一个不恰当的比喻。
书中的分公司和部门之间的关系更加形象。
下面写另外一个例子:
用组合模式重新实现商品类别树的构建(代
码+UML类图)
+服装
+男装
-衬衣
-夹克
+女装
-裙子
-套装
package 构建商品类别树;
public abstract class Component {
protected String name;
public Component(String name) {
super();
this.name = name;
}
public abstract void Add(Component c);
public abstract void Remove(Component c);
public abstract void Display(String preStr);
}
package 构建商品类别树;
public class Leaf extends Component {
public Leaf(String name) {
super(name);
// TODO Auto-generated constructor stub
}
@Override
public void Add(Component c) {
System.out.println("Cannot add to a leaf");
// TODO Auto-generated method stub
}
@Override
public void Remove(Component c) {
System.out.println("Cannot remove from a leaf");
// TODO Auto-generated method stub
}
@Override
public void Display(String preStr) {
System.out.println(preStr+"-"+name);
// TODO Auto-generated method stub
}
}
package 构建商品类别树;
import java.util.ArrayList;
import java.util.Collection;
public class Composite extends Component {
//private List<Component> children=new List<Component>();
private Collection<Component> children=new ArrayList<Component>();
public Composite(String name) {
super(name);
// TODO Auto-generated constructor stub
}
@Override
public void Add(Component c) {
children.add(c);
// TODO Auto-generated method stub
}
@Override
public void Remove(Component c) {
// TODO Auto-generated method stub
}
@Override
public void Display(String preStr) {
System.out.println(preStr+"+"+this.name);
preStr+="";
for(Component component:children) {
component.Display(preStr);
}
// TODO Auto-generated method stub
}
}
package 构建商品类别树;
public class Client {
public static void main(String[] args) {
Composite root=new Composite("服装");
Composite c1=new Composite("男装");
Composite c2=new Composite("女装");
Leaf leaf1=new Leaf("衬衣");
Leaf leaf2=new Leaf("夹克");
Leaf leaf3=new Leaf("裙子");
Leaf leaf4=new Leaf("套装");
root.Add(c1);
root.Add(c2);
c1.Add(leaf1);
c1.Add(leaf2);
c2.Add(leaf3);
c2.Add(leaf4);
root.Display(" ");
// TODO Auto-generated method stub
}
}