• 设计模式(六)学习----组合模式


    待补充图,定义等。

    1.为组合中的对象申明接口
    package desigh.commands.composites;
    
    /**
     * 
     *
     * @author lipeng24@meituan.com
     * @create 2017-10-26 下午7:56
     **/
    
    public interface ComponentFile {
        /**
         * 操作文件
         */
        void operate();
    
        /**
         * 钩子函数,判断是否是文件
         *
         * @return
         */
        boolean isFile();
    }
    package desigh.commands.composites;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     *
     *
     *
     * ComponentFile文件夹,
     * <p>
     * 1.容器对象,用于存储子部件,比如文本文件,图像文件,视频文件
     * 2.实现与子部件有关的行为操作(例如增加,删除操作)
     * 3.定义有子部件的那些行为
     *
     * ComponentFile
     *
     * 1.为组合中的对象声明接口(文件对象)
     *
     * ImageFileLeaf,TextFileLeaf,VideoFileLeaf叶子节点
     * 1.叶子节点没有子节点,表示叶子对象
     *
    
     *
     * 参考项目中的ticket_order项目的:
     *
     * 组合对象中声明的接口的方法
     * //1.Component
     * Logic
     * //2.composite 组合对象
     * CompositeLogic
     * //3.leaf 叶子节点
     * ACKSuccessLogicUnit
     *
     *
     * @author lipeng24@meituan.com
     * @create 2017-10-26 下午8:03
     **/
    
    public class CompositeFolder implements ComponentFile {
        private String name;
        public CompositeFolder(String name) {
            this.name = name;
        }
    
        private List<ComponentFile> childFiles = new ArrayList<>();
    
        /**
         * ComponentFile 中子部件共有的行为
         */
        @Override
        public void operate() {
            for (ComponentFile file : childFiles) {
                if (file.isFile()) {
                    file.operate();
                } else {
                    System.out.println("this is not a file");
                }
            }
        }
    
        @Override
        public boolean isFile() {
            return true;
        }
    
        /**
         * 添加文件
         *
         * @param file
         */
        public void addFile(ComponentFile file) {
            childFiles.add(file);
        }
    
        /**
         * 添加文件
         *
         * @param file
         */
        public void removeFile(ComponentFile file) {
            childFiles.remove(file);
        }
    
    }

    2.实现类:

    package desigh.commands.composites;
    
    /**
     * 图像文件叶子节点
     *
     * @author lipeng24@meituan.com
     * @create 2017-10-26 下午8:34
     **/
    
    public class ImageFileLeaf implements ComponentFile {
    
        private String name;
    
        public ImageFileLeaf(String name) {
            this.name = name;
        }
    
        @Override
        public void operate() {
            System.out.println("操作的是图像文件" + name);
        }
    
        @Override
        public boolean isFile() {
            return true;
        }
    }

    package desigh.commands.composites;
    
    /**
     * 文件叶子节点
     *
     * @author lipeng24@meituan.com
     * @create 2017-10-26 下午8:32
     **/
    
    public class TextFileLeaf implements ComponentFile {
    
        private String name;
    
        public TextFileLeaf(String name) {
            this.name = name;
        }
    
        @Override
        public void operate() {
            System.out.println("操作的是文本文件:" + name);
        }
    
        @Override
        public boolean isFile() {
            return true;
        }
    }
    package desigh.commands.composites;
    
    /**
     * 音频文件叶子节点,叶子节点没有子节点
     *
     * @author lipeng24@meituan.com
     * @create 2017-10-26 下午8:36
     **/
    
    public class VideoFileLeaf implements ComponentFile {
    
        private String name;
    
        public VideoFileLeaf(String name) {
            this.name = name;
        }
    
        @Override
        public void operate() {
            System.out.println("操作的是音频文件" + name);
        }
    
        @Override
        public boolean isFile() {
            return true;
        }
    }
     * 优点:
     * 1.各个叶子节点足够内聚
     * 2.客户端实现简单,可以一直的使用组合对象和单个对象
     * 3.可以面向顶层接口,统一做一些事情(eg.是否可降级,是否可异步处理,日志aop等等)
     * 4.对扩展开放,很容易的可以在组合对象内加入单个对象, 而客户端不必修改原有代码
     *
     * 使用场景:
     *
     * 1.想表示对象的整体和部分的层次,并且在此结构中,希望通过一种方式忽略整体和部分的差异
     * 2.希望用户忽略组合对象和单个对象的不同,用户将统一的使用结构中的所有对象。
     * 3.可以结合责任链模式,迭代器,装饰器,享元,访问者模式一块使用。

    参考:
    * 1.https://en.wikipedia.org/wiki/Composite_pattern
    * 2.https://foolchild.cn/2016/07/26/composite
    * 3.http://www.cnblogs.com/chenssy/p/3299719.html

  • 相关阅读:
    openSUSE字体美化
    [转摘]关于创建oracle dblink 过程的几点心得
    IList及泛型集合类转换DataTable
    C# 编码规范和编程好习惯
    随机数和随机字符串
    ThrowActivity 光阴的故事
    数据库的数据 转化为XML 在页面上浏览 光阴的故事
    EventHandlingScopeActivity 光阴的故事
    workflow 角色的使用关键 光阴的故事
    ConditionedActivityGroup 光阴的故事
  • 原文地址:https://www.cnblogs.com/200911/p/8182491.html
Copyright © 2020-2023  润新知