组合模式
1、定义
组合模式:组合多个对象形成树状结构以表示具有部分-整体关系的层次结构。组合模式让客户端可以统一对待单个对象和组合对象
2、组合模式结构
- Component(抽象构件):可以是接口或抽象类,为叶子构件和容器构件对象声明接口,在该角色中可以包含所有子类共有行为的声明和实现。在抽象构件中定义了访问及管理它的子构件的方法,如增加、删除、获取子构件等
- Leaf(叶子构件):表示叶子结点对象,没有子节点,它实现了抽象构件中定义的行为。对于访问及管理子构件的方法,可以通过抛出异常、提示错误等方法进行处理
- Composite(容器构件):表示容器节点对象,包含子节点可以是叶子节点,也可以是容器节点,它提供了一个集合用于存储子节点。实现了在抽象构件中定义的行为,包括那些访问及管理子构件的方法,在其业务方法中可以递归调用其子节点的业务方法
3、示例
Component
public abstract class Employer {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public abstract void add(Employer employer);public abstract void delete(Employer employer);public List<Employer> employers;public void printInfo() {System.out.println(name);}public List<Employer> getEmployers() {return this.employers;}
}
Leaf
public class Programmer extends Employer{public Programmer(String name) {setName(name);//程序员, 表示没有下属了employers = null;}@Overridepublic void add(Employer employer) {}@Overridepublic void delete(Employer employer) {}
}
public class ProjectAssistant extends Employer{public ProjectAssistant(String name) {setName(name);//项目助理, 表示没有下属了employers = null;}@Overridepublic void add(Employer employer) {}@Overridepublic void delete(Employer employer) {}
}
Composite
public class ProjectManager extends Employer{public ProjectManager(String name) {setName(name);employers = new ArrayList<>();}@Overridepublic void add(Employer employer) {employers.add(employer);}@Overridepublic void delete(Employer employer) {employers.remove(employer);}
}
Client
public class Client {public static void main(String[] args) {Employer pm = new ProjectManager("项目经理");Employer pa = new ProjectAssistant("项目助理");Employer programmer1 = new Programmer("程序员甲");Employer programmer2 = new Programmer("程序员乙");//为项目经理添加项目助理pm.add(pa);//为项目经理添加程序员pm.add(programmer1);pm.add(programmer2);List<Employer> ems = pm.getEmployers();for (Employer em : ems) {System.out.println(em.getName());}}
}
输出结果
项目助理
程序员甲
程序员乙
4、组合模式优缺点
4.1优点
- 可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,方便对整个层次结构进行控制
- 客户端可以一致的使用一个组合结构或者其他单个对象,无须对现有类库进行任何修改,符合开闭原则
- 增加新的容器构件和叶子构件都很方便,无须对现有类库进行任何修改,符合开闭原则
- 为树形结构的面向对象实现提供了一种灵活的解决方案
4.2缺点
- 在增加新构件时很难对容器中的构件类型进行限制
5、组合模式适用环境
- 表示对象的部分-整体层次结构
- 忽略组合对象与单个对象的不同,统一