组合模式将对象组合成树形结构,以表示“部分-整体”的层次结构,它的使用主要体现在下面两点:
1.表示树形结构。
2.统一对待组合组合对象和单个对象。在组合模式中,客户将统一的使用组合结构中的所有对象,而不需要关心它究竟是组合对象还是单个对象。
在组合模式中,请求在树中的传递总是遵循一种逻辑:
请求从树最顶端的对象往下传递,如果当前处理请求的对象是叶对象,叶对象自身会对请求作出相应的处理;如果当前处理请求的对象是组合对象,组合对象则会遍历它属下的子节点,将请求继续传递给这些子节点。
组合模型的例子:扫描文件夹
文件夹和文件之间的关系,非常适合用组合模式来描述。文件夹里既可以包含文件,又可以包含其他文件夹,最终可能组合成一棵树,组合模式在文件夹的应用中有以下两层好处。
1.操作文件夹的时候,不需要考虑文件的类型,不管是单独的文件还是包含多个文件的文件夹,组合模式让Ctrl+V、Ctrl+C成为了一个统一的操作。
2.当扫描一个文件夹时,往往不需要关心里面有多少文件和子文件夹,组合模式使得我们只需要操作最外面的文件夹进行扫描。
代码:
1 | // 定义文件夹和文件类 |
何时使用组合模式:
一般来说,组合模式适用于以下这两种情况:
1.表示对象的部分-整体层次结构。
2.客户希望统一对象树中的所有对象,在组合模式中,客户不需要关心正在处理的对象是组合对象还是叶子对象,它们会各自做自己正确的事情。