组合模式

发布 : 2018-12-10 分类 : 设计模式 浏览 :

介绍

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

结构

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

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
原文链接 : https://liuzhihang.com/2018/12/10/combination-mode.html
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

博客已萌萌哒运行(●'◡'●)ノ♥
Theme - BMW | Made With 💗 | Powered by GodBMW