• 设计模式之组合模式学习笔记


    一、组合模式的定义(是什么)?

    将对象以树状结构组织起来,并使单个对象和组合对象具有一致性

     抽象构件(component) :使单个对象和组合对象具有一致性

     单个对象(leaf):不可再细分

     组合对象(composite):内部包含单个对象或者组合对象

    二、组合模式的作用(为什么)?

    将对象组织成树状结构,单个对象和组合对象形成一致性,从而形成天然的递归。

    三、组合模式的实现(怎么办)?

    创建抽象构件,将单个对象共性提取出来(这里仅仅指安全组合模式)

    创建单个对象,继承抽象构件,实现构件的方法

    创建组合对象,继承抽象构件,实现构件的方法,并且包含构件对象集合

      如文件目录输出名字:

      

    /**
     * 文件(抽象构件)
     */
    public abstract class AbstractFile {
        private String name;//文件名
        public abstract String displayName();//展示文件名
    }
    
    /**
     * 文本文件(单个对象)
     */
    public class TextFile extends AbstractFile {
        private String name;
    
        public TextFile(String name){
            this.name = name;
        }
    
        @Override
        public String displayName() {
            return name+"	";
        }
    }
    
    /**
     * 图片文件(单个对象)
     */
    public class ImgFile extends AbstractFile {
        private String name;
    
        public ImgFile(String name){
            this.name = name;
        }
    
        @Override
        public String displayName() {
            return name+"	";
        }
    }
    
    /**
     * 文件夹(组合对象)
     */
    public class Folder extends AbstractFile{
        private String name;
    
        private List<AbstractFile> list;
    
        public Folder(String name){
            this.name = name;
            list = new ArrayList<AbstractFile>();
        }
    
        //添加文件
        public void addFile(AbstractFile abstractFile){
            list.add(abstractFile);
        }
    
        //删除文件
        public void removeFile(AbstractFile abstractFile){
            list.remove(abstractFile);
        }
    
        //获取文件
        public AbstractFile getAbstractFile(Integer index){
            return list.get(index);
        }
    
        @Override
        public String displayName() {
            String name = this.name+"(";
            for (AbstractFile file:list) {
                name += file.displayName();
            }
            name += ")";
            return name;
        }
    }
    
    public class MyTest {
        
        @Test
        public void test(){
            AbstractFile f1,f2,f3,f4,f5;
    
            f1 = new TextFile("文本文件1");
            f2 = new TextFile("文本文件2");
            f3 = new ImgFile("图片文件2");
            f4 = new Folder("文件夹1");
            f5 = new Folder("文件夹2");
    
            ((Folder) f4).addFile(f1);
            ((Folder) f4).addFile(f5);
            ((Folder) f5).addFile(f2);
            ((Folder) f5).addFile(f3);
    
            //输出文件夹1及内部所有文件名称
            System.out.println(f4.displayName());
        }
    
    }

    输出结果为:

    四、常用场景

    文件目录系统

    菜单目录系统

    杀毒软件

  • 相关阅读:
    OLED的相关信息
    FilterDispatcher is depredated!plesae use the new filters
    lua c函数注册器
    一个简易版本的lua debugger实现
    【Unity Shaders】Using Textures for Effects——让sprite sheets动起来
    GDAL库中WFS服务中含有中文不能获取数据的问题
    golang:使用timingwheel进行大量ticker的优化
    扩展GDAL,支持CNSDTF格式(一)
    理解WebKit和Chromium: Android 4.4 上的Chromium WebView
    学习tornado:异步
  • 原文地址:https://www.cnblogs.com/LiuChengGang/p/13088020.html
Copyright © 2020-2023  润新知