【设计模式】(十四)–结构型模式–组合模式
组合模式定义
Compose objects into tree srtuctures to represent part-whole hierarchies . Composite lets clients treat individual objects and compositions of objects uniformly.
意思是:将对象组合成树形结构以表示“部分–整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
组合模式一般有3个元素
- Component 抽象节点
- Leaf 叶子结点
- Composite 复合节点,该节点包括符合节点的子节点或者叶子节点的子节点
组合模式的优点
- 1、高层模块调用简单。
- 2、节点自由增加。
组合模式在使用时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。不易使用继承的方法来增加新的行为,不易控制树枝构建的类型。
组合模式的使用场景
需要描述对象的部分和整体的等级结构的场景,如树形菜单,文件、文件夹的管理。需要使用者忽略个体构建和组合构建的区别,平等对待所有的构件。
组合模式的简单实现
类图
实现
public class CompositePatternTest {
public static void main(String[] args) {
Employee CEO = new Employee("大少", "CEO", 30000);
Employee technicalManager = new Employee("二少", "技术经理", 20000);
Employee opsManager = new Employee("三少", "ops经理", 20000);
Employee javaDevelop1 = new Employee("二少的小弟1", "Java开发", 10000);
Employee javaDevelop2 = new Employee("二少的小弟2", "Java开发", 10000);
Employee ops1 = new Employee("三少的小弟1", "ops开发", 10000);
Employee ops2 = new Employee("三少的小弟1", "ops开发", 10000);
CEO.add(technicalManager);
CEO.add(opsManager);
opsManager.add(javaDevelop1);
opsManager.add(javaDevelop2);
opsManager.add(ops1);
opsManager.add(ops2);
System.out.println(CEO);
for (Employee headEmployee : CEO.getSubordinates()) {
System.out.println(headEmployee);
for (Employee employee : headEmployee.getSubordinates()) {
System.out.println(employee);
}
}
}
}
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
+ ", dept : " + dept + ", salary :"
+ salary + " ");
}
}
结果