设计模式:组合模式

组合模式非java核心中的组合。

组合模式的定义:把部分和整体关系用“树形结构”来表示。从而使客户端可用同一方式处理部分对象或整体对象。

树形结构例子:比如平时的配置文件xml, 文件系统等

 

核心:

  抽象角色:定义了叶子和容器构件的共同点。如文件系统中文件和文件夹的特性。

  叶子构建角色(树的叶子):无子节点。如文件系统中的文件。

  容器构建角色:如文件系统中的文件夹。

组合模式使用户在使用时通过抽象角色一致处理容器和叶子。

当容器对象指定方法被调用时,将遍历整个树形结构。寻找包含这个方法的成员并调用执行。

例子:

  

/**
 * 模拟杀毒软件
 * <p>
 * 抽象组件,
 */
public interface AbstraceFile {

    void scanVirus();
}

/**
 * 叶子组件
 * <p>
 * 文件。
 */
class TextFile implements AbstraceFile {

    private String name;

    public TextFile(String name) {
        this.name = name;
    }

    @Override
    public void scanVirus() {
        System.out.println("完成文本文件" + name + "扫描");
    }
}

/**
 * 容器组件
 * <p>
 * 文件夹
 */
class Folder implements AbstraceFile {
    private String name;
    private List<AbstraceFile> fileList;

    public Folder(String name) {
        this.name = name;
        fileList = new ArrayList<>();
    }

    /**
     * 这里包含一个天然递归方法
     */
    @Override
    public void scanVirus() {
        System.out.println("扫描文件夹");
        for (AbstraceFile file : fileList) {
            file.scanVirus();
        }

    }

    /**
     * 容器新增方法
     *
     * @param file
     */
    public void add(AbstraceFile file) {
        fileList.add(file);
    }

    /**
     * 容器新增方法
     *
     * @param file
     */
    public void remove(AbstraceFile file) {
        fileList.remove(file);
    }
}

  

public class Client {
    public static void main(String[] args) {
        Folder file1 = new Folder("文件夹1");
        AbstraceFile file2 = new TextFile("文本文件1");

//        file2.scanVirus();
        
        file1.add(file2);
        //统一处理方式
        file1.scanVirus();

    }
}

  这里模拟了一个简单的文件扫描工具,先建立文件夹,和一些文件,使用统一的操作接口去操作文件和文件夹,进行扫描操作。

 

posted @ 2018-12-27 21:42  小阿Q的博客  阅读(164)  评论(0编辑  收藏  举报