您的位置:首页 > 其它

设计模式(九)---组合模式

2013-07-17 13:34 375 查看
将对象组合成树形结构以表示"部分-整体"的层次结构。

"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

--------------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: