将对象组合成树形结构以表示"部分-整体"的层次结构。
"Composite使得用户对单个对象和组合对*的使用具有一致性。"
组合模式个人理解就是在共同的父类或抽象类中定义一个容器,
这个容器的对象类型还是本身,并定义容器的维护方法。
这种结构很像树结构。理解成树结构就没什么好说的了。
下面给出例子:
package test.design.composite.one;
import java.util.ArrayList;
import java.util.List;
/**
* 员工类
* 定义组合对象的类型
*
* @author lushuaiyin
*
*/
public abstract class Staff {
public Staff(){}
public Staff(String name){
this.name=name;
}
private String name;//员工名称
public List<Staff> subordinate=new ArrayList<Staff>();//下属(composite容器)
/*
这里必须定义一个composite对象,其实就是一个容器,它里面对象类型是自己本身。
这就是组合的关键。继承这个类的所有对象都可以在这个容器中装同类对象,达到组合
的效果。这种结构其实很像树结构,不过比树结构还要简单,它只是提供了子节点容器和
维护方法而已。说到这里,我们认为树结构就是组合模式的具体实现。那么同样,在实际中
我们遇到树结构的数据类型,就可以考虑组合模式,实际上我们也是这么做的,可能在做的时候
还不知道这叫组合模式。
*/
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/*
既然定义了容器,就 必须定义容器的业务维护方法。
容器有自己的怎删改查方法,我们还需要根据业务把需要的维护定义成方法。
比如这个下属员工的容器,需要增加员工,删除员工等
*/
public List<Staff> getSubordinate() {//获取下属员工
return subordinate;
}
public void addSubordinate(Staff subordinate) {//增加下属
this.subordinate.add(subordinate);
}
public void addSubordinateList(List<Staff> subordinateList) {//增加下属
this.subordinate.addAll(subordinateList);
}
public void delSubordinate(Staff subordinate){//删除下属
if(subordinate!=null){
if(this.subordinate.contains(subordinate)){
this.subordinate.remove(subordinate);
}
}
}
public abstract void work();//业务抽象
public void printSubordinateInfo(){
System.out.println("--------------------------------------");
if(this.subordinate==null||this.subordinate.size()==0){
System.out.println(this.getName()+" 没有下属员工。");
}else{
String info=this.getName()+"的下属员工有:\r\n";
for(int i=0;i<this.subordinate.size();i++){
Staff s=(Staff)this.subordinate.get(i);
if(s!=null&&s.getName()!=null){
if(i==this.subordinate.size()-1){
info+=s.getName();
}else{
info+=s.getName()+",";
}
}
}//end for
System.out.println(info);
}
System.out.println("--------------------------------------");
}
}
package test.design.composite.one;
public class ProjectManager extends Staff{
public ProjectManager(){}
public ProjectManager(String name){
super(name);
}
@Override
public void work() {
System.out.println("I am ProjectManager,my name is "+this.getName()+".I control the project.");
}
}
package test.design.composite.one;
/**
* 程序员
* @author lushuaiyin
*
*/
public class Programmer extends Staff{
public Programmer(){}
public Programmer(String name){
super(name);
}
@Override
public void work() {
System.out.println("I am Programmer,my name is "+this.getName()+".I work always.");
}
}
package test.design.composite.one;
/**
* 客户端测试
* @author lushuaiyin
*
*/
public class TestMain {
/**
* @param args
*/
public static void main(String[] args) {
Staff c=new CTO("CTO_one");
System.out.println(c instanceof Staff);
ProjectManager pm1=new ProjectManager("ProjectManager_p1");
Staff pm2=new ProjectManager("ProjectManager_p2");
Staff kubi1=new Programmer("程1");
Staff kubi2=new Programmer("程2");
Programmer kubi3=new Programmer("程3");
//组合
c.addSubordinate(pm1);
c.addSubordinate(pm2);
pm1.addSubordinate(kubi1);
pm1.addSubordinate(kubi2);
pm2.addSubordinate(kubi3);
//打印
c.printSubordinateInfo();
pm1.printSubordinateInfo();
pm2.printSubordinateInfo();
kubi1.printSubordinateInfo();
kubi2.printSubordinateInfo();
kubi3.printSubordinateInfo();
//业务
c.work();
pm1.work();
pm2.work();
kubi1.work();
kubi2.work();
kubi3.work();
//测试组合方法
pm1.delSubordinate(kubi1);
pm1.printSubordinateInfo();
pm2.addSubordinate(kubi1);
pm2.printSubordinateInfo();
}
}
打印:
true
--------------------------------------
CTO_one的下属员工有:
ProjectManager_p1,ProjectManager_p2
--------------------------------------
--------------------------------------
ProjectManager_p1的下属员工有:
程1,程2
--------------------------------------
--------------------------------------
ProjectManager_p2的下属员工有:
程3
--------------------------------------
--------------------------------------
程1 没有下属员工。
--------------------------------------
--------------------------------------
程2 没有下属员工。
--------------------------------------
--------------------------------------
程3 没有下属员工。
--------------------------------------
I am CTO,my name is CTO_one.I control the whole thing.
I am ProjectManager,my name is ProjectManager_p1.I control the project.
I am ProjectManager,my name is ProjectManager_p2.I control the project.
I am Programmer,my name is 程1.I work always.
I am Programmer,my name is 程2.I work always.
I am Programmer,my name is 程3.I work always.
--------------------------------------
ProjectManager_p1的下属员工有:
程2
--------------------------------------
--------------------------------------
ProjectManager_p2的下属员工有:
程3,程1
--------------------------------------