组合模式:
将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
适用性:
1.你想表示对象的部分-整体层次结构
2.你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象
参与者
1.Component
为组合中的对象声明接口。
在适当的情况下,实现所有类共有接口的缺省行为。
声明一个接口用于访问和管理Component的子组件。
(可选)在递归结构中定义一个接口用于访问一个父部件,并在合适的情况下实现它。
2.Leaf
在组合中表示叶节点对象,叶节点没有子节点。
在组合中定义节点对象的行为。
3.Composite
定义有部分的某些部件的行为。
存储子部件。
在Component接口中实现与子部件有关的操作
4.Client
通过Component接口操作组合部件的对象
一个简单的例子:
Component
public abstract class Employer{
private String name;
public void setName(String name){
this.name=name;
}
public Stirng 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);
}
public List getEmployers(){
return this.employers;
}
}
Leaf
public class Programmer extends Employer{
public Programmer(String name){
setName(name);
employers =null;
}
public void add(Employer employer){}
public void delete(Employer employer){}
}
public class ProjectAssistant extends Employer{
public ProjectAssistant(String name)
{
setName(name);
employers=null;
}
public void add(Employer employer){}
public void delete(Employer employer){}
}
Composite
public class Projectmanager extends Employer{
public ProjectManager(String name){
setName(name);
emplyers = new ArrayList();
}
public void add(Employer employer){
emplyers.add(emplyer);
}
public void delete(Employer employer){
emplyers.remove(employer);
}
}
Client
public class Test{
public static void main(String[] args)
{
Empoyer pm=new ProjectManager("项目经理");
Empoyer pa=new ProjectManager("项目助理");
Empoyer programer1=new ProjectManager("程序员一");
Empoyer programer2=new ProjectManager("程序员二");
pm.add(pa);
pm.add(programer2);
List ems=pm.getEmployers();
for(Employer em:ems){
System.out.println(em.getName());
}
}
}
result
项目助理
程序员二