组合模式

http://35java.com/zhibo/forum.php?mod=viewthread&tid=37&extra=page%3D4
将对象组合成树形结构以表示"部分-整体"的层次结构。"Composite使得用户对单个对象和组合对*的使用具有一致性。"



适用性



1.
你想表示对象的部分-整*层次结构。


2.
你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。





参与者



1.Component

为组合中的对象声明接口。

在适当的情况下,实现所有类共有接口的缺省行为。

声明一个接口用于访问和管理Component的子组件。

(
可选)在递归结构中定义一个接口,用于访问一个父部件,并在合*的情况下实现它。


2.Leaf

在组合中表示叶节点对象,叶节点没有子节点。

在组合中定义节点对象的行为。


3.Compos*te

定义有子部件的*些部件的行为。

存储子部件。

在Component接口中实现与子部件有*的操作。


4.Client

通过Component接*操纵组合部件的对象。



类图





例子

Component


p*blic abstract class Employer {

private String name;


public void setName(String name) {

this.name = *ame;

}


public String getName() {

return this.name;

}


public abstract void add(Employer employer*;


public abstract void delete(Employer employer);


public List employers;


public void printInfo*) {

System.out.println(name);

}


*ublic List getE*ployers() {

return this.employers;

}
}

Leaf


public class Programmer extends Employer {

public Programmer(String name) {

setNam*(name);

employers = null;//
程序员, 表示没有下属了

}


public v*id add(Employer employer) {



}


public void delete(Employer employer) {


}
}
public class Pro*ectAssistant extends Employer {

public ProjectAss*stant(String name) {

setName(name);

employers = *ull;//
项目助理, 表示没有下属了

}


public void add(Employer employer) {


}


public void delet*(Employer employer) {


}
}

Composite


public class Project*anager extends E*ployer {

public ProjectManager(String name) {

setName(name);

employers = new A*rayList();

}


public void add(Employer employer) {

employers.add(employer);

}


public void delete(Emplo*er employer) {

employers.remove(employer);

}
}

Clie*t


publ*c class Test {

public st*tic void main(String[] args) {

Employer pm = new ProjectManager("
项目经理");
Emplo*er pa = new ProjectAssistant("
项目助理");
Employer progra*mer1 = new Programmer("
程序员一");
Employer programmer2 = new Programmer("
程序员二");

pm.add(pa);//
为项目经理添加项目助理

pm.add(programmer2);//*
项目经理*加程序员


List ems = pm.getEm*loyers();

for (Employer em : ems) {

System.out.println(em.getNam*());

}

*
}

result


项目助理
程序员二

你可能感兴趣的:(组合模式)