再战设计模式(九)之组合模式

组合模式

工作流程分析

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

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

角色:

抽象组件角色: 定义了叶子和容器组件的共同点.下面的代码用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 

总结:

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

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

猜你喜欢

转载自www.cnblogs.com/bj-xiaodao/p/10847781.html