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

    输出结果为:

    四、常用场景

    文件目录系统

    菜单目录系统

    杀毒软件

  • 相关阅读:
    ExtJS 刷新或者重载Tree后,默认选中刷新前最后一次选中的节点代码片段
    ios>APP名称的多语言化(转)
    android>apk破解以及重新编译(转)
    MFC动态库基本概念
    (内存中的)堆和栈的区别(转过无数次的文章)
    面向对象五大基本原则
    VS20052008程序发布、打包(MFC)
    在MFC中创建动态控件的生成与响应
    SQL2000自动备份数据库并发送邮件报告数据库自动备份情况
    The Concept of Callbacks
  • 原文地址:https://www.cnblogs.com/LiuChengGang/p/13088020.html
Copyright © 2011-2022 走看看