• 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、简化客户端代码

  • 相关阅读:
    Java openrasp学习记录(一)
    Java ASM3学习(3)
    Java ASM3学习(2)
    Java Instrumentation插桩技术学习
    Java ASM3学习(1)
    从JDK源码学习HashSet和HashTable
    从JDK源码学习HashMap
    从JDK源码学习ArrayList
    Java XXE漏洞典型场景分析
    CVE-2020-7961 Liferay Portal 复现分析
  • 原文地址:https://www.cnblogs.com/tdyang/p/13280558.html
Copyright © 2020-2023  润新知