zoukankan      html  css  js  c++  java
  • 设计模式之组合模式

    参考博文:https://www.cnblogs.com/jingmoxukong/p/4221087.html 侵权删除

    2019-06-25  13:36:54

    组合模式  Component

    什么是组合模式:将对象组合成“树形”结构以表示“部分-整体”的层次结构。使得客户对单个对象或组合对象的使用具有一致性

    适用性:需要对单个对象和对象组合提供一致性的操作。

    组合模式成员:

      Component:组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理 Component 的子部件。

      Composite:定义枝节点行为,用来存储子部件,在 Component 接口中实现与子部件相关的操作。例如 Add 和 Remove。

      leaf:表示叶节点对象,叶子节点没有子节点()。

    组合模式代码思考:

      需要对叶子节点和枝节点提供统一性的操作,故将叶子节点和枝节点抽象提供统一的接口。

      枝节点中的operation()方法:

        for(Component c : components){
            c.operation();
        }

      叶节点中的operation()方法:

        public void operation() {
            //相应操作
        }
    

    组合模式基本代码:

    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 将对象和对象组合抽象
     */
    public interface Component {
        public void add(Component c);
        public void remove(Component c);
        public void operation();
    }
    
    /**
     * 枝节点
     * 对象组合,可以添加或删除对象
     * 
     */
    class Composite implements Component{
        private String name;
        private List<Component> components;
    
    
        //List集合表示子结点容器
        public Composite(String name) {
            components = new ArrayList<>();
            this.name = name;
        }
    
        @Override
        public void add(Component c) {
            components.add(c);
        }
    
        @Override
        public void remove(Component c) {
            components.remove(c);
        }
    
        @Override
        public void operation() {
            for(Component c : components){
                c.operation();
            }
        }
    }
    
    /**
     * 叶子节点
     * 不能有添加节点或删除节点
     */
    class Leaf implements Component{
        private String name;
    
        public Leaf(String name) {
            this.name = name;
        }
    
        @Override
        public void operation() {
            System.out.println("leaf operation   " + name);
        }
    
        @Override
        public void add(Component c) {}
    
        @Override
        public void remove(Component c) {}
    }
    
    /**
     * 客户端
     * 测试代码
     *
     */
    class Client{
        public static void main(String[] args) {
            Component root = new Composite("root");
            Component node1 = new Composite("node1");
            Component leaf1 = new Leaf("leaf1");
            Component leaf21 = new Leaf("leaf21");
            Component leaf22 = new Leaf("leaf22");
    
            root.add(node1);
            root.add(leaf1);
            node1.add(leaf21);
            node1.add(leaf22);
    
            root.operation();
            node1.operation();
            leaf1.operation();
        }
    }
    
        /*
        输出结果:
        leaf operation   leaf21
        leaf operation   leaf22
        leaf operation   leaf1
        leaf operation   leaf21
        leaf operation   leaf22
        leaf operation   leaf1
         */
  • 相关阅读:
    Spring Boot分布式系统实践【扩展1】shiro+redis实现session共享、simplesession反序列化失败的问题定位及反思改进
    Spring Boot分布式系统实践【2】框架搭建
    javascript日期比较 js日期相差天数计算
    SyntaxHighlighter_代码高亮插件
    CSS控制div自动延伸到窗口100%高度
    iphone天气插件weathericon,安装,及其解决天气不变的方法!亲测!
    Zapatec.Calendar 说明文档
    html设置多少秒跳转
    CSS命名规范
    解决firefox的button按钮文字不能垂直居中
  • 原文地址:https://www.cnblogs.com/youzoulalala/p/11082515.html
Copyright © 2011-2022 走看看