• 设计模式-组合模式(Composite)


    组合模式是构造型模式的一种。通过递归手段构造树形的对象结构,并可以通过一个对象来访问整个对象树

    角色和职责:

    就是文件夹那种形式,树形

    UML图:

    具体代码:

    import java.util.List;
    
    /**
     * Ifile 统一接口
     */
    public interface Ifile {
        void display();//显示
        boolean add(Ifile file);//添加
        boolean remove(Ifile file);//删除
        List<Ifile> getChild();//获取孩子节点
    }
    import java.util.List;
    
    /**
     * 文件
     */
    public class File implements Ifile{
        private String fileName;//文件名
        public File(String fileName){
            this.fileName = fileName;
        }
    
        @Override
        public void display() {
            System.out.println(fileName);
        }
    
        @Override
        public boolean add(Ifile file) {
            return false;
        }
        @Override
        public boolean remove(Ifile file) {
            return false;
        }
        @Override
        public List<Ifile> getChild() {
            return null;
        }
    }
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 目录
     */
    public class Folder implements Ifile{
        private String fileName;//文件名
        private List<Ifile> list = null;//目录集合
        public Folder(String fileName){
            this.fileName = fileName;
            this.list = new ArrayList<Ifile>();
        }
    
        @Override
        public void display() {
            System.out.println(fileName);
        }
    
        @Override
        public boolean add(Ifile file) {
            this.list.add(file);
            return true;
        }
    
        @Override
        public boolean remove(Ifile file) {
            this.list.add(file);
            return true;
        }
    
        @Override
        public List<Ifile> getChild() {
            return this.list;
        }
    }
    import java.util.List;
    
    public class Main {
        public static void main(String[] args) {
            Ifile folder_d = new Folder("d:");
            Ifile file_d_aa = new File("aa.txt");
            Ifile folder_d_dingding = new Folder("dingding");
            Ifile folder_d_dingding_bin = new Folder("bin");
            Ifile file_d_dingding_b = new File("可执行文件.exe");
            Ifile file_d_dingding_bin_b = new File("mm.exe");
            Ifile file_d_bb = new File("bb.txt");
    
            folder_d_dingding_bin.add(file_d_dingding_bin_b);
    
            folder_d_dingding.add(folder_d_dingding_bin);
            folder_d_dingding.add(file_d_dingding_b);
    
            folder_d.add(file_d_aa);
            folder_d.add(folder_d_dingding);
            folder_d.add(file_d_bb);
    
            show(folder_d,0);//显示当前目录下的节点
        }
    
        /**
         * 显示当前目录下的节点
         * @param file
         */
        public static void show(Ifile file,int deep){
            for(int m=0;m<deep;m++){
                System.out.print("--");
            }
            List<Ifile> list = file.getChild();
            for(int i = 0; i<list.size();i++){
                Ifile fi = list.get(i);
                System.out.print("--");
                if(fi instanceof  File){
                    for(int n=0;n<deep-1;n++){
                        System.out.print("--");
                    }
                    fi.display();
                }else{
                    fi.display();
                    show(fi,++deep);
                }
            }
        }
    }

     结果:

    --aa.txt
    --dingding
    ----bin
    --------mm.exe
    ----可执行文件.exe
    --bb.txt

    优缺点:

    优:

    • 可以清楚地定义分层次的复杂类型,表示对象的全部层次或者部分层次  ,它让客户端忽略了层次的差异,方便对整个层次经行控制
    • 客户端可以一致的使用一个组合模式或对单个对象,不必关心处理的是单个对象还是整个组合结构,简化了客户端的代码
    • 在组合模式种增加新的容器构件和叶子构件都很方便,无需对现有类库进行任何修改,符合开闭原则。
    • 为树形结构的面向对象实现提供了一种灵活的解决方案,通过叶子对象和容器对象的递归组合可以形成复杂的树形机构,但对树形结构的控制却很简单

    应用场景:

    在一个使用面向对象语言开发的系统中需要处理一个树形结构的

    在一个系统中能分离出叶子和容器的,而且他们的类型还固定不变,需要增加一些新的类型

    源码地址:https://github.com/qjm201000/design_pattern_composite.git

  • 相关阅读:
    bzoj3507: [Cqoi2014]通配符匹配
    bzoj2120: 数颜色
    bzoj2038: [2009国家集训队]小Z的袜子(hose)
    laravel表单图片上传
    laravel使用$errors提取错误信息
    laravel中的old()函数
    laravel的函数asset()、url()
    laravel表单提交
    laravel中if
    laravel的foreach
  • 原文地址:https://www.cnblogs.com/qjm201000/p/10070869.html
Copyright © 2020-2023  润新知