zoukankan      html  css  js  c++  java
  • 设计模式之组合模式学习笔记

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

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

     抽象构件(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());
        }
    
    }

    输出结果为:

    四、常用场景

    文件目录系统

    菜单目录系统

    杀毒软件

  • 相关阅读:
    JNI--java调用C&C++
    不能在utf8和UCS2之间转换:failUTF8Conv
    java生成随机数
    itext操作pdf文件
    Adobe Acrobat的安装时出现:服务print spooler启动失败,请确认您有足够权限启动系统服务
    lob类型数据处理 java.lang.IllegalStateException: No LobHandler found for configuration
    No Dialect mapping for JDBC type–4 hibernate查询MySQL中longBlob数据
    JAVA中的继承初始化
    Log4j简单使用
    深入浅出hibernate 学习
  • 原文地址:https://www.cnblogs.com/LiuChengGang/p/13088020.html
Copyright © 2011-2022 走看看