设计模式-组合模式
# 设计模式-组合模式
# 概述
组合模式通过一种巧妙的设计方案使得用户可以一致性地处理整个树形结构或树形结构的一部分,它描述了如何将容器对象和叶子对象进行递归组合,使得用户在使用时无须对他们进行区分,可以一致地对待容器对象和叶子对象。
# 定义
组合模式使用面向对象的方式来处理树形结构,它为叶子构件和容器构件提供了一个公共的抽象构件类了,客户端可以针对抽象构建进行处理,而无须关心所操作的是叶子构件还是容器构件。
**组合模式:**组合多个对象形成树形结构以表示具有部分-整体关系的层次结构。组合模式让客户端可以统一对待单个对象和组合对象。
# 组合模式结构
Component(抽象构件):为组合对象和叶子对象声明公共的接口,让客户端可以通过这个接口来访问和管理整个对象树,并可以为这些定义的接口提供缺省的实现。 Composite(容器构件):通常会存储子组件(组合对象、叶子对象),定义包含子组件的那些组件的行为,并实现在抽象组件中定义的与子组件有关的操作,例如子组件的添加(addChild)和删除(removeChild)等。 Leaf(叶子构件) :定义和实现叶子对象的行为,并且它不再包含其他的子节点对象。
# 组合模式应用案例
1、创建一个员工类
public class Employee {
private final String name;
private final String dept;
private final int salary;
private final List<Employee> subordinates;
//构造函数
public Employee(String name, String dept, int sal) {
this.name = name;
this.dept = dept;
this.salary = sal;
subordinates = new ArrayList<Employee>();
}
public void add(Employee e) {
subordinates.add(e);
}
public void remove(Employee e) {
subordinates.remove(e);
}
public List<Employee> getSubordinates() {
return subordinates;
}
public String toString() {
return ("Employee :[ Name : " + name
+ ", dept : " + dept + ", salary :"
+ salary + " ]");
}
}
2、设计一个树形结构的案例,遍历这个树形结构
public class Demo {
public static void main(String[] args) {
Employee CEO = new Employee("John", "CEO", 30000);
Employee headSales = new Employee("Robert", "Head Sales", 20000);
Employee headMarketing = new Employee("Michel", "Head Marketing", 20000);
Employee clerk1 = new Employee("Laura", "Marketing", 10000);
Employee clerk2 = new Employee("Bob", "Marketing", 10000);
Employee salesExecutive1 = new Employee("Richard", "Sales", 10000);
Employee salesExecutive2 = new Employee("Rob", "Sales", 10000);
CEO.add(headSales);
CEO.add(headMarketing);
headSales.add(salesExecutive1);
headSales.add(salesExecutive2);
headMarketing.add(clerk1);
headMarketing.add(clerk2);
//打印该组织的所有员工
System.out.println(CEO);
for (Employee headEmployee : CEO.getSubordinates()) {
System.out.println(headEmployee);
for (Employee employee : headEmployee.getSubordinates()) {
System.out.println(employee);
}
}
}
}
3、输出结果
Employee :[ Name : John, dept : CEO, salary :30000 ]
Employee :[ Name : Robert, dept : Head Sales, salary :20000 ]
Employee :[ Name : Richard, dept : Sales, salary :10000 ]
Employee :[ Name : Rob, dept : Sales, salary :10000 ]
Employee :[ Name : Michel, dept : Head Marketing, salary :20000 ]
Employee :[ Name : Laura, dept : Marketing, salary :10000 ]
Employee :[ Name : Bob, dept : Marketing, salary :10000 ]
# 组合模式优缺点
优点:
1、可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,让客户端忽略了层次的差异,方便对整个层次结构进行控制。
2、客户端可以一致地使用一个组合结构或其中单个对象,不必关心处理的是单个对象还是整个组合结构。
3、为树形结构的面向对象实现提供了一种灵活的解决方案。
缺点:
1、在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。
2、在增加新构件时很难对容器中的构件类型进行限制。
# 组合模式适用环境
1、在具有整体和部分的层次结构中希望通过一种方式忽略整体与部分的差异,客户端可以一致地对待他们。
2、在一个使用面向对象语言开发的系统中需要处理一个树形结构。
3、在一个系统中能够分离出叶子对象和容器对象,而且他们的类型不固定,需要增加一些新的类型。
# 参考
Java设计模式