本文首发于cdream的个人博客,点击获得更好的阅读体验!
欢迎转载,转载请注明出处。
本文简单介绍组合模式,以系统文件和文件夹为例。

一、概述
定义:组合模式(Composite pattern)将对象整合到树状结构中来表示整体/部分的层次关系,在树状结构中包括对象和对象组合。组合模式能让客户用一致的方式处理个别对象的对象组合。
1.部分-整体的层级结构以树状结构来表现
2.部分整体的层级结构中,对象和对象组合要以一致方式处理
二、结构
UML:

主要角色:
抽象构件类(Compnent):为所有对象定义了一个接口,无论是叶节点还是组合。
叶构件类(Leaf):继承了抽象构件类,但是没有子构件了,虽然继承了add,remove,getChildren方法,但是对于叶节点来说没什么意义,不过为了保持透明性,我们坚持这么做。
树枝构件类(Component):继承了抽象构件类,持有一个子构件类容器口。
三、系统文件目录
系统文件目录是一个典型的包括叶构件(文件)和树枝构件(文件夹)的组合模式。

当然文件夹和文件操作上还是有区别的,不过,我在这里就让文件夹和文件都实现相同的接口,完成最理想的组合的组合模式——放弃安全性,追求透明性。
定义一个抽象接口,为了保证可以使用户不关心究竟是什么,所有文件/文件夹都要实现这个接口。
public abstract class FileInterface { // 添加文件 void add(FileInterface file) { throw new UnsupportedOperationException(); } // 删除文件 void remove(String fileName) { throw new UnsupportedOperationException(); } // 获取文件 Set<FileInterface> getChildren() { throw new UnsupportedOperationException(); } // 获取文件名字 String getName(){ throw new UnsupportedOperationException(); } // 获取文件描述 String getDescription(){ throw new UnsupportedOperationException(); }; // 运行程序 void run(){ throw new UnsupportedOperationException(); }; }写一个文件夹类
public class Directory implements FileInterface { private String name; private String desc; // 文件夹要持有文件列表 private Set<FileInterface> set = new HashSet<>(); public Directory(String name, String desc) { this.name = name; this.desc = desc; } @Override public void add(FileInterface file) { set.add(file); } @Override public void remove(String fileName) {
