设计模式(九)---组合模式
2013-07-17 13:34
375 查看
将对象组合成树形结构以表示"部分-整体"的层次结构。
"Composite使得用户对单个对象和组合对*的使用具有一致性。"
组合模式个人理解就是在共同的父类或抽象类中定义一个容器,
这个容器的对象类型还是本身,并定义容器的维护方法。
这种结构很像树结构。理解成树结构就没什么好说的了。
下面给出例子:
打印:
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
--------------------------------------
"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
--------------------------------------
相关文章推荐
- 设计模式—组合模式
- 设计模式学习--组合模式
- 设计模式(2)-策略模式之多用组合少用继承
- 设计模式_组合模式(14)
- Java语言设计模式之组合模式(Composite)
- 设计模式(九)组合模式(Composite)-结构型
- 深入理解JavaScript系列(40):设计模式之组合模式
- 【结构型模式】组合模式(Composite)之23种java设计模式
- 设计模式中结构型模式(三)组合模式(Composite)
- 设计模式 组合模式
- 设计模式笔记之八 (组合模式)
- 设计模式—组合模式
- 设计模式之组合模式(Composite)
- "围观"设计模式(16)--结构型之组合模式(Composite Pattern)
- 设计模式之Composite(组合)模式
- 设计模式 - 组合模式(composite pattern) 详解
- JavaScript 设计模式之组合模式解析
- 设计模式之组合模式
- 设计模式【组合模式】
- 游戏设计模式系列(三)—— 策划变心太快?也许可以使用组合