软考
APP下载

组合模式的分类

组合模式是一种经典的设计模式,它主要用于将一组对象组合成树形结构,以表示“整体-部分”的层次关系。组合模式可以递归地构建树形结构,同时保证了整体和部分之间的一致性。

从组合模式的实现方式来看,可以将其分为两种不同的类型:透明式组合模式和安全式组合模式。

透明式组合模式

透明式组合模式指的是将树形结构中的所有节点都抽象为同样的对象,无论是叶子节点还是容器节点,都具有相同的接口。这样做的好处在于,客户端无需区分容器节点和叶子节点,可以将它们当作同一类型的对象来处理。透明式组合模式的UML类图如下所示:

![Transparent Composite Pattern](https://cdn.jsdelivr.net/gh/wxyyxc1992/OI-wiki/images/Design-Pattern/15-1.png)

从UML图中可以看到,透明式组合模式中共有两个类:Component类和Leaf类。其中Component类定义了所有对象都具有的接口,而Leaf类表示叶子节点。另外,Composite类表示容器节点,它不仅实现了Component接口,还包含了一个用于存储子节点的容器。

由于透明式组合模式中将叶子节点和容器节点抽象为同样的对象,因此在客户端调用时,无需区分它们的类型。但是这种做法并不够安全,因为容器节点中可能包含叶子节点和其它容器节点,而不同类型的节点具有不同的行为。因此,如果客户端在调用时没有进行类型判断,很容易出现运行时错误。

安全式组合模式

安全式组合模式指的是将容器节点和叶子节点分别定义为不同的接口。具体来说,容器节点应该固有一个用于管理子节点的方法,而叶子节点则不能包含任何子节点。因此,在安全式组合模式中,客户端必须明确知道它处理的是容器节点还是叶子节点。安全式组合模式的UML类图如下所示:

![Safe Composite Pattern](https://cdn.jsdelivr.net/gh/wxyyxc1992/OI-wiki/images/Design-Pattern/15-2.png)

从UML图中可以看到,安全式组合模式中有三个类:Component类、Leaf类和Composite类。其中Component类定义了容器节点和叶子节点都具有的接口,而Leaf类只实现了Component接口中的方法。另外,Composite类表示容器节点,它除了实现Component接口外,还包含了一个用于存储子节点的容器。

安全式组合模式和透明式组合模式相比,虽然存在一定的代码冗余,但它可以有效地避免在运行时混淆容器节点和叶子节点的情况。因此,在实际应用中,应该尽可能地使用安全式组合模式。

除了从实现方式的角度来分析,还可以从组合模式的使用场景来进行分类。具体来说,可以将组合模式分为以下两种类型。

对象树

对象树是组合模式应用最为广泛的场景,它是指将一类对象组合成树形结构,并且具有递归结构。例如,文件系统中的文件和目录可以看作是一个对象树。在对象树中,容器节点包含了若干个子节点,而叶子节点不包含任何子节点。

对象图

对象图是一种由多个对象组成的复杂结构,它的结构并不是递归的。在对象图中,每个节点都可能有若干个后继节点,而且每个后继节点的类型不同。例如,一个文档编辑器中可以包含若干个图形和一些文字,它们共同组成了整个文档。

备考资料 免费领取:软件设计师报考指南+考情分析+思维导图等 立即下载
真题演练 精准解析历年真题,助你高效备考! 立即做题
相关阅读
软件设计师题库