zoukankan      html  css  js  c++  java
  • 组合模式【结构模式】

    组合模式

    Composite objects into tree structures to represent part-whole hierarchies.
    Composite lets clients treat individual objects and compositions of objects uniformly.
    将对象组合成树形结构以表示"整体-部分"的层次结构,
    组合模式允许客户端统一处理单个对象或组合对象。
    
    @Slf4j
    public class Composite {
        /**
         * 组合模式:
         * Composite objects into tree structures to represent part-whole hierarchies.
         * Composite lets clients treat individual objects and compositions of objects uniformly.
         * 将对象组合成树形结构以表示"整体-部分"的层次结构,组合模式允许客户端统一处理单个对象或组合对象。
         */
        @Test
        public void all() {
            final CTO cto = new CTO("kristy", 100);
            cto.setArea("杭州");
    
            cto.addLeaf(buildSecretary("s1", 500, "吃饭"));
            cto.addLeaf(buildSecretary("s2", 500, "睡觉"));
            cto.addLeaf(buildSecretary("s3", 500, "打豆豆"));
    
            final Manager m1 = new Manager("m1", 500);
            m1.addLeaf(new Worker("w1", 30));
            m1.addLeaf(new Worker("w2", 40));
            m1.addLeaf(new Worker("w3", 50));
    
            cto.addLeaf(m1);
    
            final Manager m2 = new Manager("m2", 400);
            m2.addLeaf(new Worker("w4", 60));
            m2.addLeaf(new Worker("w5", 70));
            m2.addLeaf(buildSecretary("s4", 300, "摸鱼"));
    
            cto.addLeaf(m2);
            show(cto);
        }
    
        private static Secretary buildSecretary(String name, double salary, String extend) {
            final Secretary s3 = new Secretary(name, salary);
            s3.setExtend(extend);
            return s3;
        }
    
        public static void show(IBranch root) {
            log.info(root.info());
            root.subLeaies().forEach(sub -> {
                if (sub instanceof IBranch) {
                    show((IBranch) sub);
                } else {
                    log.info(sub.info());
                }
            });
        }
    
    }
    
    /**
     * 1)参加组合的所有对象的共有属性或方法,可以是抽象类
     */
    interface ICorp {
        String info();
    }
    
    /**
     * 2)叶子构件接口
     */
    interface ILeaf extends ICorp {
    }
    
    /**
     * 3)树枝构件接口
     */
    interface IBranch extends ICorp {
        void addLeaf(ICorp leaf);
    
        void removeLeaf(ICorp leaf);
    
        List<ICorp> subLeaies();
    }
    
    /**
     * 4)共有组件接口的核心实现
     */
    @AllArgsConstructor
    abstract class Emp implements ICorp {
        protected final String name;
        protected final double salary;
    
        @Override
        public String info() {
            return new StringJoiner("-").add(name).add(String.valueOf(salary)).toString();
        }
    }
    
    /**
     * 5)叶子实现
     */
    class Worker extends Emp implements ILeaf {
        public Worker(String name, double salary) {
            super(name, salary);
        }
    }
    
    /**
     * 6)树枝实现
     */
    class Manager extends Emp implements IBranch {
        public Manager(String name, double salary) {
            super(name, salary);
        }
    
        @Default
        private final List<ICorp> leavies = Lists.newArrayList();
    
        @Override
        public void addLeaf(ICorp leaf) {
            leavies.add(leaf);
        }
    
        @Override
        public List<ICorp> subLeaies() {
            return leavies;
        }
    
        @Override
        public void removeLeaf(ICorp leaf) {
            leavies.remove(leaf);
        }
    }
    
    /**
     * 7)特化树枝实现
     */
    @Data
    class CTO extends Manager {
        public CTO(String name, double salary) {
            super(name, salary);
        }
    
        private String area;
    
        @Override
        public String info() {
            return new StringJoiner("-").add(super.info()).add(getArea()).toString();
        }
    }
    
    /**
     * 8)特化叶子实现
     */
    @Data
    class Secretary extends Emp implements ILeaf {
        private String extend;
    
        public Secretary(String name, double salary) {
            super(name, salary);
        }
    
        @Override
        public String info() {
            return new StringJoiner("-").add(super.info()).add(extend).toString();
        }
    }
    
  • 相关阅读:
    Chandy-Lamport_algorithm
    3 differences between Savepoints and Checkpoints in Apache Flink
    列数 行数 表数 限制
    数据收集、传输、元数据管理、作业流调度、海量数据查询引擎、数据可视化
    分析云负载均衡产品
    端口被占用通过域名的处理 把www.domain.com均衡到本机不同的端口 反向代理 隐藏端口 Nginx做非80端口转发 搭建nginx反向代理用做内网域名转发 location 规则
    JSON Web Token
    查看开启端口的应用
    If the parts of an organization (e.g., teams, departments, or subdivisions) do not closely reflect the essential parts of the product, or if the relationship between organizations do not reflect the r
    微服务架构的理论基础
  • 原文地址:https://www.cnblogs.com/zhuxudong/p/10164351.html
Copyright © 2011-2022 走看看