概述
组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当做一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分及整体层次。该设计模式属于结构型模式,它创建了对象组的树形结构。
这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。
意图:将对象组合成树形结构以表示"部分-整体"的层次关系。组合模式使得用户对单个对象和组合对象的使用具有一致性。
主要解决:它在树形结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
何时使用:想表示对象的部分-整体层次结构(树形结构)。希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
如何解决:树枝和叶子实现统一接口,树枝内部组合该接口。
关键代码:树枝内部组合该接口,并且含有内部属性List,里面放Component。
优点:高层模块调用简单。节点自由增加。
缺点:在使用组合模式时,其叶子和树枝的声明都是实现类,而非接口,违反了依赖倒置原则。
使用场景:部分、整体场景,如树形菜单、文件、文件夹的管理。
实例
下面的实例演示了一个组织中员工的层次结构。
定义一个员工类Employee,该类被当做组合模型类。测试类使用Employee类来添加部门层次结构,并打印所有员工信息。
创建Employee类
该类带有Employee对象的列表
public class Employee {
//姓名
private String name;
//职位
private String post;
//工资
private Integer salary;
//下属
private List<Employee> subordinates;
//构造函数
public Employ(String name,String post,Integer salary) {
this.name = name;
this.post = post;
this.salary = salary;
this.subordinates = new ArrayList<Employee>();
}
public void addEmployee(Employee e) {
subordinates.add(e);
}
public void removeEmployee(Employee e) {
subordinates.remove(e);
}
//省略setter和getter方法
}
测试类
public class CompositePatternDemo {
public static void main(String[] args) {
Employee ceo = new Employee("宋江","ceo",3000);
Employee softwareLeader = new Employee("武松","软件部门经理",2000);
Employee marketLeader = new Employee("林冲","市场部门经理",2000);
Employee backDeveloper = new Employee("花荣","后端开发人员",1000);
Employee frontDeveloper = new Employee("燕青","前端开发人员",1000);
Employee salesman1 = new Employee("雷横","销售人员1",1000);
Employee salesman2 = new Employee("张顺","销售人员2",1000);
ceo.add(softwareLeader);
ceo.add(marketLeader);
softwareLeader.add(backDeveloper);
softwareLeader.add(frontDeveloper);
marketLeader.add(salesman1);
marketLeader.add(salesman2);
//打印ceo信息
printEmployee(ceo);
for(Employee e1 : ceo.getSubordinates()) {
//打印部门经理信息
printEmployee(e1);
for(Employee e2 : e1.getSubordinates()) {
//打印普通员工信息
printEmployee(e2);
}
}
}
//打印员工信息方法
public static void printEmployee(Employee e) {
System.out.println("姓名:" + e.getName() + ",职位:" + e.getPost() + ",工资:" + e.getSalary());
}
}
打印结果
组合模式,就是在一个对象中包含其他对象,这些被包含的对象可能是终点对象(不再包含别的对象),也有可能是非终点对象(其内部还包含其他对象,或叫组对象),将对象称为节点,即一个根节点包含许多子节点,这些子节点有的仍然包含子节点,有的不包含子节点。
所谓组合模式,就是对象包含对象的问题,通过组合的方式(在对象内部引用对象)来进行布局,这种组合是区别于继承的,另一层含义是指树形结构子节点的抽象(将叶子节点与树枝节点抽象为子节点),区别于普通的分别定义叶子节点与树枝节点的方式。