java设计模式(十二)——组合模式

1、基本概念

组合模式( Composite Pattern )也称为整体部分( Part-Whole )模式,它的宗旨是通过将单个
对象(叶子节点)和组合对象(树枝节点)用相同的接口进行表示,使得客户对单个对象和组合对象的
使用具有一致性,属于结构型模式。

组合模式是一种树结构,那么就知道生活中得案例了,比如 目录-文件,学校-年级-班级,公司-部门

组合模式分为透明模式和安全模式

2、类图和角色

2.1、透明模式

2.2、安全模式

 两者的区别在于抽象组件Component只定义了一个必须实现的方法,这样叶子节点Leaf,就不会去调用无关的方法,比如addChild方法

角色·:

抽象根节点:Component

分支节点:Composite

叶子结点:Leaf

3、案例

案例:一个公司有两个部门行政部和开发部

行政部

  后勤部

  人力部

开发部

  java开发

  python开发

  c开发

抽象根节点:

public interface ICompany {

    void printDeptName();

}

树枝节点:

public class Composite  implements ICompany{

    private List<ICompany> list = new ArrayList<>();

    private String name;
    private Integer level;

    public Composite(String name, Integer level) {
        list.add(new Dept(name));
        this.name = name;
        this.level = level;
    }

    public void addDept(ICompany icompany){
        list.add(icompany);
    }
    public  void  addAllDept(List<Dept> deptList){
        for (Dept dept : deptList) {
            list.add(dept);
        }
    }

    @Override
    public void printDeptName() {
        for (int i = 0; i <list.size() ; i++) {
            if( i == 0){
                System.out.println("");
            }else{
                System.out.print("---");
            }
            list.get(i).printDeptName();
        }
    }
}

叶子结点

public class Dept implements ICompany{

    private String name;

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

    public String getName() {
        return name;
    }

    @Override
    public void printDeptName() {
        System.out.println(name);
    }
}

测试:

public class Test {
    public static void main(String[] args) {
        Dept dept1 =  new Dept("行政部");
        Dept dept2 =  new Dept("人力部");
        Dept dept3 =  new Dept("后勤部");

        Dept dept4 =  new Dept("开发部");
        Dept dept5 =  new Dept("java开发部");
        Dept dept6 =  new Dept("python开发部");
        Dept dept7 =  new Dept("c开发部");

        Composite composite = new Composite(dept1.getName(),2);
        composite.addDept(dept2);
        composite.addDept(dept3);
        composite.printDeptName();

        System.out.println("_____________________________________");

        Composite composite2 = new Composite(dept4.getName(),2);
        List<Dept> deptList = new ArrayList<>();
        deptList.add(dept5);
        deptList.add(dept6);
        deptList.add(dept7);
        composite2.addAllDept(deptList);
        composite2.printDeptName();
    }
}

输出:

行政部
---人力部
---后勤部
_____________________________________

开发部
---java开发部
---python开发部
---c开发部

4、优缺点

优点:

1、可以清晰的分层

2、符合开闭原则

3、简化客户端代码

原文地址:https://www.cnblogs.com/tdyang/p/13280558.html