简介
组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。
这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。
我们通过下面的实例来演示组合模式的用法。实例演示了一个组织中员工的层次结构。
类图
代码
/**
* 组合模式
* @author: 张彬
* @date: 2018年5月22日 上午11:24:28
* @version: V1.0
* @review: 张彬/2018年5月22日 上午11:24:28
*/
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+" ]");
}
}
/**
* 测试
* @author: 张彬
* @date: 2018年5月22日 上午11:25:53
* @version: V1.0
* @review: 张彬/2018年5月22日 上午11:25:53
*/
public class Client {
public static void main(String[] args) {
Employee CEO = new Employee("CEO","CEO", 30000);
Employee headSales = new Employee("销售总监","Head Sales", 20000);
Employee headMarketing = new Employee("市场总监","Head Marketing", 20000);
Employee clerk1 = new Employee("市场调查员1","Marketing", 10000);
Employee clerk2 = new Employee("市场调查员2","Marketing", 10000);
Employee salesExecutive1 = new Employee("销售员1","Sales", 10000);
Employee salesExecutive2 = new Employee("销售员2","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);
}
}
}
}
输出结果:
Employee :[ Name : CEO, dept : CEO, salary :30000 ]
Employee :[ Name : 销售总监, dept : Head Sales, salary :20000 ]
Employee :[ Name : 销售员1, dept : Sales, salary :10000 ]
Employee :[ Name : 销售员2, dept : Sales, salary :10000 ]
Employee :[ Name : 市场总监, dept : Head Marketing, salary :20000 ]
Employee :[ Name : 市场调查员1, dept : Marketing, salary :10000 ]
Employee :[ Name : 市场调查员2, dept : Marketing, salary :10000 ]
总结
优点:1、高层模块调用简单。2、节点自由增加。
缺点:在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。
使用场景:部分、整体场景,如树形菜单,文件、文件夹的管理。