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());
        }
    
    }

    输出结果为:

    四、常用场景

    文件目录系统

    菜单目录系统

    杀毒软件

  • 相关阅读:
    洛谷 P4708
    NFLSOJ 1060
    Codeforces 1264D
    Solution -「多校联训」Sample
    Solution -「多校联训」光影交错
    Solution -「LOJ #138」「模板」类欧几里得算法
    Solution -「LOJ #141」回文子串 ||「模板」双向 PAM
    Codeforces Round #700 (Div. 2)
    Codeforces Round #698 (Div. 2) C and D
    「NOI 2021」题解
  • 原文地址:https://www.cnblogs.com/LiuChengGang/p/13088020.html
Copyright © 2011-2022 走看看