组合模式

对树形模式处理相对合适, 将对象组合成树形结构以表示“部分-整体”的层次结构, 使得用户对单个对象和组合对象的使用具有一致性.

结构

  • 抽象构件
  • 叶子构件
  • 容器构件
    组合模式

Demo

以文件夹举例, 定义公共抽象, 文件夹为容器构件, 文件为叶子构件

抽象构件
public abstract class AbstractFile {

    protected String name;

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

    public void addFile(AbstractFile abstractFile) {
        System.out.println("不允许添加");
    }

    public void removeFile(AbstractFile abstractFile) {
        System.out.println("不允许删除");
    }

    public void updateFileName(String name) {
        System.out.println("不允许修改");
    }
    public void printFile() {
        System.out.println("不允许获取");
    }
}
容器构件
public class FolderFile extends AbstractFile {

    private List<AbstractFile> abstractFileList = new ArrayList<>();

    public FolderFile(String name) {
        super(name);
    }

    @Override
    public void addFile(AbstractFile abstractFile) {
        abstractFileList.add(abstractFile);
    }

    @Override
    public void removeFile(AbstractFile abstractFile) {
        abstractFileList.remove(abstractFile);
    }

    @Override
    public void updateFileName(String name) {
        this.name = name;
    }

    @Override
    public void printFile() {

        System.out.println(this.name);
        for (AbstractFile abstractFile : abstractFileList) {
            abstractFile.printFile();
        }
    }
}
具体构件
public class TextFile extends AbstractFile {

    public TextFile(String name) {
        super(name);
    }

    @Override
    public void updateFileName(String name) {
        this.name = name;
    }

    @Override
    public void printFile() {
        System.out.println(this.name);
    }
}
Test
public class CompositeTest {

    public static void main(String[] args) {

        AbstractFile file = new FolderFile("文本文档");
        file.printFile();

        AbstractFile text1 = new TextFile("文档1.txt");
        AbstractFile text2 = new TextFile("文档2.txt");

        file.addFile(text1);
        file.addFile(text2);
        System.out.println("---------------");
        file.printFile();

        System.out.println("---------------");
        text1.addFile(text2);
    }
}

输出结果:

文本文档
---------------
文本文档
文档1.txt
文档2.txt
---------------
不允许添加

总结

  • 符合”开闭原则”, 新增容器构件和叶子构件较方便
  • 简化代码, 层次清晰
  • 比较适用于树形结构

   版权声明

文章作者: liuzhihang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源!