组合模式:“
将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
”
Composite模式好处:
1.使客户端调用简单,客户端可以一致的使用组合结构或其中单个对象,用户就不必关系自己处理的是单个对象还是整个组合结构,这就简化了客户端代码。
2.更容易在组合体内加入对象部件. 客户端不必因为加入了新的对象部件而更改代。
一个总公司下面有部门和分公司,分公司下面也有部门和分公司。
1.组合模式的例子
public abstract class GongSi {
String name;
public GongSi(String name)
{
this.name=name;
}
public void ShowName()
{
System.out.println(name);
}
public abstract void add(GongSi gongSi);
public abstract void remove(GongSi gongSi);
public abstract void iterate();
}
public class BuMen extends GongSi{
public BuMen(String name) {
super(name);
// TODO Auto-generated constructor stub
}
@Override
public void add(GongSi gongSi) {
// TODO Auto-generated method stub
}
@Override
public void remove(GongSi gongSi) {
// TODO Auto-generated method stub
}
@Override
public void iterate() {
// TODO Auto-generated method stub
System.out.println(name);
}
}
public class FenGongSi extends GongSi{
private ArrayList<GongSi> list=new ArrayList<GongSi>();
public FenGongSi(String name) {
super(name);
// TODO Auto-generated constructor stub
}
@Override
public void add(GongSi zongGongSi) {
// TODO Auto-generated method stub
list.add(zongGongSi);
}
@Override
public void remove(GongSi gongSi) {
// TODO Auto-generated method stub
list.remove(gongSi);
}
@Override
public void iterate() {
// TODO Auto-generated method stub
System.out.println(name);
for (GongSi c : list) {
c.iterate();
}
}
}
public static void main(String[] args) {
FenGongSi fenGongSi=new FenGongSi("总公司");
fenGongSi.add(new BuMen("总公司下部门1"));
fenGongSi.add(new BuMen("总公司下部门2"));
FenGongSi fengongsi1=new FenGongSi("总公司下分公司1");
fenGongSi.add(fengongsi1);
FenGongSi fengongsi2=new FenGongSi("总公司下分公司2");
fenGongSi.add(fengongsi2);
FenGongSi fengongsi11=new FenGongSi("总公司下分公司1分部门1");
fengongsi1.add(fengongsi11);
FenGongSi fengongsi12=new FenGongSi("总公司下分公司1分部门2");
fengongsi1.add(fengongsi12);
FenGongSi fengongsi21=new FenGongSi("总公司下分公司2分部门1");
fengongsi2.add(fengongsi21);
FenGongSi fengongsi22=new FenGongSi("总公司下分公司2分部门2");
fengongsi2.add(fengongsi22);
fenGongSi.iterate();
}
运行结果:
总公司
总公司下部门1
总公司下部门2
总公司下分公司1
总公司下分公司1分部门1
总公司下分公司1分部门2
总公司下分公司2
总公司下分公司2分部门1
总公司下分公司2分部门2
3.什么情况下使用组合模式
引用大话设计模式的片段:“当发现需求中是体现部分与整体层次结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑组合模式了。”