组合模式:将对象组合成树形结构以表示部分整体的关系,Composite使得用户对单个对象和组合对象的使用具有一致性。
Composite好处:
1.使客户端调用简单,客户端可以一致的使用组合结构或其中单个对象,用户就不必关系自己处理的是单个对象还是整个组合结构,这就简化了客户端代码。
2.更容易在组合体内加入对象部件. 客户端不必因为加入了新的对象部件而更改代码。
如何使用Composite?
首先定义一个接口或抽象类,这是设计模式通用方式了,其他设计模式对接口内部定义限制不多,Composite却有个规定,那就是要在接口内部定义一个用于访问和管理Composite组合体的对象们(或称部件Component)
package com.qinsoft.design; import java.util.ArrayList; import java.util.List; abstract class Employer { private String name; public void setName(String name) { this.name = name; } public String getName() { return this.name; } abstract void add(Employer employer); abstract void delete(Employer employer); List<Employer> employers; void printInfo() { System.out.println(name); } List<Employer> getEmployers() { return this.employers; } } //Leaf class Programmer extends Employer { Programmer(String name) { setName(name); employers = null; } void add(Employer employer) { } void delete(Employer employer) { } } class ProjectAssistant extends Employer { ProjectAssistant(String name) { setName(name); employers = null; } void add(Employer employer) { } void delete(Employer employer) { } } class Projectmanager extends Employer { Projectmanager() { employers = new ArrayList<Employer>(); } Projectmanager(String name) { setName(name); employers = new ArrayList<Employer>(); } public void add(Employer employer) { employers.add(employer); } void delete(Employer employer) { employers.remove(employer); } } public class Composite { public static void main(String[] args) { Employer pm = new Projectmanager(); Employer pa = new ProjectAssistant("项目助理"); Employer programer1 = new Programmer("程序员一"); Employer programer2 = new Programmer("程序员二"); pm.add(pa); pm.add(programer2); List<Employer> ems = pm.getEmployers(); for (Employer em : ems) { System.out.println(em.getName()); } } }