意图
将对象组合成树形结构以表示“整体-部分”的层次结构。Compositor使得用户对单个对象和组合对象的使用具有一致性。
适用性
以下情况使用Compositor模式:
- 想表示对象的部分-整体层次结构。
- 希望用户忽略组合对象与单个对象的不同。用户将统一地使用组合结构中的所有对象。
结构
参与者
- Component
-在适当情况下,实现所有类共有接口的缺省行为。
-声明一个接口用于访问和管理Component的子组件。
-(可选)在递归结构中定义一个接口,用于访问一个副部件。并在合适的情况下实现它。
- Leaf
-在组合中定义图元对象的行为。
- Composite
-存储子部件。
-在Component接口实现与子部件有关的操作。
- Client
协作
Client通过component类接口与组合结构中的对象进行交互。如果接收者是一个叶节点,则直接请求处理。如果接收者是Composite,它通常将请求发送给它的子部件。在转发请求之前或之后可能执行一些辅助操作。
效果
- 定义了包含基本对象和组合对象的类层次结构。
- 简化客户代码。
- 使得更容易增加新类型的组件。
- 使设计变得更加一般化。
实现
我们有一个类 Employee,该类被当作组合模型类。CompositePatternDemo,我们的演示类使用 Employee 类来添加部门层次结构,并打印所有员工。
步骤 1
创建 Employee 类,该类带有 Employee 对象的列表。
Employee.java
import java.util.ArrayList;
import java.util.List;
public class Employee {
private String name;
private String dept;
private int salary;
private 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
使用 Employee 类来创建和打印员工的层次结构。
CompositePatternDemo.java
public class CompositePatternDemo {
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);
}
}
}
}
Android中的应用
Android中ViewGroup-View是典型的组合模式。