zoukankan      html  css  js  c++  java
  • 再战设计模式(九)之组合模式

    组合模式

    工作流程分析

      组合模式为处理树形结构提供了完美的解决方案,描述了如何将容器和叶子进行递归组合,使得用户在使用时可以一致性的对待容器和叶子

      当容器对象的指定方法被调用时,将遍历整个树形结构,寻找包含整个方法的成员,并调用执行,其中,使用了递归调用的机制对整个结构进行处理

    角色:

    抽象组件角色: 定义了叶子和容器组件的共同点.下面的代码用abstractFile 来代替

    叶子(leaf)角色:  特点无子节点

    容器(composite)角色: 有容器特征可以包含子节点 folder类来代替

    类图

    代码:

    我们来简单的模拟下一个杀毒软件的树形结构.来进行杀毒

    package com.disign.composite;
    
    public interface AbstractFile {
    
    
        void killVirus();
    }
    
    
    /**
     * 叶子节点角色
     */
    class ImageFile implements AbstractFile {
    
        private String name;
    
        public ImageFile(String name) {
            this.name = name;
        }
    
    
        @Override
        public void killVirus() {
            System.out.println("kill  " + name + " virus ");
        }
    }
    
    
    class VideoFile implements AbstractFile {
        private String name;
    
        public VideoFile(String name) {
            this.name = name;
        }
    
    
    
        @Override
        public void killVirus() {
            System.out.println("kill  " + name + " virus ");
        }
    }
    
    
    class TextFile implements AbstractFile {
        private String name;
    
        public TextFile(String name) {
            this.name = name;
        }
    
    
        @Override
        public void killVirus() {
            System.out.println("kill  " + name + " virus ");
        }
    }
    
    
    /**
     * 在组合模式中代表 容器
     */
    public class Folder implements  AbstractFile {
        private String name;
    
        public Folder(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    
        private LinkedList<AbstractFile> list = new LinkedList<>();
    
        public void add(AbstractFile file){
            list.add(file);
    
        }
    
        public void remove(AbstractFile file){
            list.remove(file);
        }
    
        public AbstractFile get(int index ){
    
            return list.get(index);
        }
    
        @Override
        public void killVirus() {
            System.out.println("kill "+name +" folder");
    
            for (AbstractFile abstractFile : list) {
                abstractFile.killVirus();
    
            }
    
        }
    }
    
    
    
    public class Main {
        public static void main(String[] args) {
    
            AbstractFile f1,f2,f3,f4,f5;
    
            Folder file = new Folder("我的收藏");
    
            f1 = new ImageFile("不健康的图片.jpg");
            f2 = new TextFile("不健康的文本");
            file.add(f1);
            file.add(f2);
    
            Folder folder = new Folder("电影");
            f3 = new VideoFile("3d肉蒲团");
            f4 = new VideoFile("一路向西");
            f5 = new VideoFile("公司职工");
            folder.add(f3);
            folder.add(f4);
            folder.add(f5);
            file.add(folder);
            file.remove(f2);
            Folder file1 = (Folder)file.get(1);
    
            file.killVirus();
    
        }
    }
    kill 我的收藏 folder
    kill  不健康的图片.jpg virus 
    kill 电影 folder
    kill  3d肉蒲团 virus 
    kill  一路向西 virus 
    kill  公司职工 virus 

    总结:

    我们在软件开发中,很多情况都遇到了组合模式,比如后台管理组织架构 树形开发等

    当我们遇到树的时候,就可以尝试用这种设计模式来设计.

  • 相关阅读:
    random、shutil、shevle、标准输入输出错误流
    Python中Json 和 pickle 详解
    Python 中的sys、os、os.path模块总结
    Python 中time,calendar,datatime模块总结
    包的概念和导入包的方法
    Python 中模块及其导入方式
    迭代器和生成器
    python 函数参数
    JAVA 配置Path环境变量
    腾讯云服务器简单配置web项目
  • 原文地址:https://www.cnblogs.com/bj-xiaodao/p/10847781.html
Copyright © 2011-2022 走看看