模式意图:让用户能够用统一的接口处理“单个对象”以及“对象组合(集合)”. 这种设计模式,在出现树形等层次结构时使用。
1.component (共享的公共接口或者抽象类):此可作为各组合对象的基础,同时也是其下属成员的统一接口:
import java.util.List;
public abstract class Employer {
/* Component (共享接口):
* 1、“单个对象”以及“对象组合”的共享接口。
* 2、它定义了公用的一些方法及成员变量。
* 3、由它来统一对“单个对象”以及“对象组合”的操作
*/
protected List<Employer>employers;
private Stringname;
public String getName() {
returnname;
}
public void setName(String name) {
this.name = name;
}
public void showInfo() {
System.out.println(name);
}
public abstract void add(Employer em);
public abstract void delete(Employer em);
public List<Employer> getEmployers() {
returnemployers;
}
}
2.leaf (单个成员):此种类型的组合对象表示只有其自身,而没有其下属成员:
2.1 Programmer:
public class Programmerextends Employer {
/**
* leaf类,即单个类。
*/
public Programmer(String name) {
setName(name);
employers =null;
}
public void add(Employer em) {
// TODO Auto-generated method stub
}
public void delete(Employer em) {
// TODO Auto-generated method stub
}
}
2.2(Tester):
public class Testerextends Employer {
/**
* leaf类,即单个类。
*/
public Tester(String name) {
setName(name);
employers =null;
}
public void add(Employer em) {
// TODO Auto-generated method stub
}
public void delete(Employer em) {
// TODO Auto-generated method stub
}
}
3.composite (组合成员):真正地组合(集合)对象:它有自己的下属成员,具体存储在employers里面:
public class ProgramManagerextends Employer {
/**
* Composite类,即组合类(集合类)。
* 他下面又多个组成部件(员工),因此需要employers
*/
public ProgramManager(String name) {
setName(name);
employers =new ArrayList<Employer>();
}
public void add(Employer em) {
// TODO Auto-generated method stub
employers.add(em);
}
public void delete(Employer em) {
// TODO Auto-generated method stub
employers.remove(em);
}
}
4.测试程序:定义一个项目助理,两个程序员,一个项目经理,然后把前三者加到项目经理中去,接着取出项目经理的三个下属,再分别输出相关信息:
public staticvoid main(String[] args) {
ProgramManager pm = new ProgramManager("项目经理");
Tester te =new Tester("测试");
Programmer p1 =new Programmer("程序员一");
Programmer p2 =new Programmer("程序员二");
pm.add(te);
pm.add(p1);
pm.add(p2);
for (Employer em : pm.getEmployers()) {
em.showInfo();
}
}5.运行结果:
项目助理
程序员一
程序员二
6.我的体会:
使用组合模式就是为了使对组合对象和单个对象的使用是一致的(定制统一的共享接口或者抽象类来实现)。如本例中Programmer和ProgramAssistant是单个对象,而programmanager是组合对象,但是他们都是employer的扩展,所以使用起来就可以认为是一样的。但是有可能会有下属,所以在employer里面要能够存储一系列的employer,本例中具体是指定义了一个list<employer>,如果没有下属的话,我们将相应变量设为空;如果有的话,我们加进去就可以了。当然,这些下属成员也可以进行获取,删除等操作。
转载地址:http://rainbowj234.diandian.com/post/2011-11-20/6979825