组合模式(Compostite Pattern)是设计模式里的结构型模式一种。
它的结构类似于数据结构里的树形结构。
把一组对象通过容器类来存放,通过最外部的对象来逐渐的显示里面的对象。
优点:
- 高层模块调用简单
- 节点自由增加
缺点:
- 使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。
- 依赖倒置原则:这个原则是开闭原则的基础,具体内容:针对接口编程,依赖于抽象而不依赖于具体。
开闭原则:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类
小例子:公司的组织结构可以用组合模式来表示;
代码:
import java.util.ArrayList;
import java.util.List;
class Employee{
private String name;
private String dept;
private int salary;
private List<Employee> subordinates;
Employee(String name,String dept,int salary){
this.name=name;
this.dept=dept;
this.salary=salary;
subordinates=new ArrayList<Employee>();
}
void add(Employee e){
subordinates.add(e);
}
void remove(Employee e){
subordinates.remove(e);
}
List<Employee> getSubordinates(){ //返回容器对象,是实现树形结构的基础
return subordinates;
}
public String toString(){
return ("Emplyee:[ Name:"+name+",dept:"+dept+",salary:"+salary+"]");
}
}
public class CompositePatternDemo {
public static void main(String[] args) {
Employee CEO=new Employee("李明","CEO",30000);
Employee headSales = new Employee("王一","Head Sales", 20000);
Employee headMarketing = new Employee("王二","Head Marketing", 20000);
Employee clerk1 = new Employee("孙一","Marketing", 10000);
Employee clerk2 = new Employee("孙二","Marketing", 10000);
Employee salesExecutive1 = new Employee("赵一","Sales", 10000);
Employee salesExecutive2 = new Employee("赵二","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);
}
}
}
}
输出:
Emplyee:[ Name:李明,dept:CEO,salary:30000]
Emplyee:[ Name:王一,dept:Head Sales,salary:20000]
Emplyee:[ Name:赵一,dept:Sales,salary:10000]
Emplyee:[ Name:赵二,dept:Sales,salary:10000]
Emplyee:[ Name:王二,dept:Head Marketing,salary:20000]
Emplyee:[ Name:孙一,dept:Marketing,salary:10000]
Emplyee:[ Name:孙二,dept:Marketing,salary:10000]
注意点:
- 重写了Objec的toString方法后,其实是打印语句的格式控制,打印语句直接打印对象。