组合模式

/ 设计模式

组合模式 (composite)

将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性

GoF23种设计模式中,属于结构型模式( Structural patterns)

以公司组织架构为例。一个公司通常是由许多部门组成的,每个部门下有可能有许多小部门以及每个小部门的主管。

这里部门主管可以看做员工的一种。员工与部门可以看做“部分-整体”的关系。最后员工与部门共同组成了公司的全部员工。

公司组织架构简图

这里将主管和部门组合统一表示为公司员工,可以方便组织架构的统一调度和管理。

实现

模式总览.png

角色说明

举例

组合模式举例

public class Organization {

    public void print(){
        throw new UnsupportedOperationException();
    }

    public void add(Organization organization){
        throw new UnsupportedOperationException();
    }

    public void remove(Organization organization){
        throw new UnsupportedOperationException();
    }

    public Organization getChild(Integer index){
        throw new UnsupportedOperationException();
    }

}
public class Staff extends Organization{

    private String name;

    public Staff(String name) {
        this.name = name;
    }

    @Override
    public void print() {
        System.out.println(name);
    }
}
public class Department extends Organization {

    private List<Organization> organizationList = new ArrayList<>();

    private String name;
    private Integer level;

    public Department(String name, Integer level) {
        this.name = name;
        this.level = level;
    }

    @Override
    public void print() {
        System.out.println(this.name);
        for (Organization organization : organizationList) {
            for (int i = 0; i < level; i++) {
                System.out.print("  ");
            }
            organization.print();
        }
    }

    @Override
    public void add(Organization organization) {
        organizationList.add(organization);
    }

    @Override
    public void remove(Organization organization) {
        organizationList.remove(organization);
    }

    @Override
    public Organization getChild(Integer index) {
        if (index > organizationList.size()) {
            return null;
        }

        return organizationList.get(index);
    }
}
public class Client {

    public static void main(String[] args) {

        //组建公司
        Department company = new Department("ordin company",1);
        Department hr = new Department("hr",2);
        Department dev = new Department("dev",2);
        Department it = new Department("it",3);
        Staff ceo = new Staff("ordin(主管-CEO)");
        Staff cto = new Staff("ordinT(主管-CTO)");
        Staff it1 = new Staff("开发-it1");
        Staff it2 = new Staff("开发-it2");

        //一级部门
        company.add(ceo);
        company.add(dev);
        company.add(hr);

        //二级部门
        dev.add(cto);
        dev.add(it);
        it.add(it1);
        it.add(it2);
        company.print();

        System.out.println("\n互联网寒冬来了 呼呼呼~");
        System.out.println("开始裁员 .......\n");

        //裁员 开发-it2
        company.getChild(1).getChild(1).remove(it2);
        company.print();

    }
}
ordin company
  ordin(主管-CEO)
  dev
    ordinT(主管-CTO)
    it
      开发-it1
      开发-it2
  hr

互联网寒冬来了 呼呼呼~
开始裁员 .......

ordin company
  ordin(主管-CEO)
  dev
    ordinT(主管-CTO)
    it
      开发-it1
  hr

实例

code: org.apache.ibatis.scripting.xmltags.SqlNode#apply

sqlnode简图

总结

组合模式就是把多个对象组合成一个对象,减少对多个对象的访问。方便系统管理和使用。