组合模式(Composite Pattern)是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。
优点: 1、高层模块调用简单。 2、节点自由增加。
缺点:在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。
使用场景:系统对象层次具备整体和部分,呈树形结构,且要求具备统一行为(如树形菜单,操作系统目录结构,公司组织架构等)
public class Employee {
private String name;
private String dept;
private int age;
private int salary;
private List<Employee> subordinates = new ArrayList<Employee>();
public Employee(String name, String dept, int age, int salary) {
this.name = name;
this.dept = dept;
this.salary = salary;
this.age = age;
}
public void add(Employee e) {
subordinates.add(e);
}
public void remove(Employee e) {
subordinates.remove(e);
}
public List<Employee> getSubordinates() {
return subordinates;
}
@Override
public String toString() {
return "name=" + name + " dept=" + dept + " age=" + age + " salary=" + salary;
}
public static void main(String[] args) {
Employee HuangSir = new Employee("HuangSir", "BOSS", 28, 600000);
Employee DaLao = new Employee("DaLao", "DevelopDepart Leader", 29, 40000);
Employee DiaoSi = new Employee("DiaoSi", "TestDepart Leader", 27, 30000);
Employee ZhangSan = new Employee("ZhangSan", "DevelopDepart", 26, 14000);
Employee LiSi = new Employee("LiSi", "DevelopDepart", 26, 14000);
Employee WangWu = new Employee("WangWu", "TestDepart", 26, 8000);
Employee ZhaoLiu = new Employee("ZhaoLiu", "TestDepart", 26, 8000);
HuangSir.add(DaLao);
HuangSir.add(DiaoSi);
DaLao.add(ZhangSan);
DaLao.add(LiSi);
DiaoSi.add(WangWu);
DiaoSi.add(ZhaoLiu);
System.out.println(HuangSir);
for (Employee headEmployee : HuangSir.getSubordinates()) {
System.out.println(headEmployee);
for (Employee employee : headEmployee.getSubordinates()) {
System.out.println(employee);
}
}
}
}
运行结果
name=HuangSir dept=BOSS age=28 salary=600000
name=DaLao dept=DevelopDepart Leader age=29 salary=40000
name=ZhangSan dept=DevelopDepart age=26 salary=14000
name=LiSi dept=DevelopDepart age=26 salary=14000
name=DiaoSi dept=TestDepart Leader age=27 salary=30000
name=WangWu dept=TestDepart age=26 salary=8000
name=ZhaoLiu dept=TestDepart age=26 salary=8000