2020-05-01 18:43:34 +03:00
|
|
|
|
# 复合模式
|
|
|
|
|
|
|
|
|
|
复合模式,目的是为了实现对一类对象的一致性访问,复合模式也叫组合模式,但是不同于go本身的组合设计理念,go本身的组合宽泛的多,用于结构与结构、结构与接口、接口与接口的嵌套组合.
|
|
|
|
|
|
|
|
|
|
我认为用复合表述更准确一些,复合模式的要点在于设计复合类型,兼容多种有相关关系类型,使得外部可以使用的使用方式使用相同接口(往往可能需要传入不同的参数)访问对象或者对象集。
|
|
|
|
|
|
2020-05-02 09:58:55 +03:00
|
|
|
|
复合模式在内存中的数据结构逻辑上常常表达为一个多叉树结构,所以有时候更直接叫树模式,用于统一叶子节点对象和非叶子节点对象的访问,很明显复合模式可用于与类别相关的问题处理,并且尤其擅长类别相似的问题的处理。
|
2020-05-01 18:43:34 +03:00
|
|
|
|
|
|
|
|
|
所以反过来想,当遇到分类相关并且关系可以表达为<整体-局部>关系的,或者遇到可以用树状逻辑梳理和表达的问题时候,复合模式可能就是最佳的问题解决思路了
|
|
|
|
|
|
|
|
|
|
引申一下,在我们处理算法的时候,往往是一个输入一个输出,但是在处理过程中往往是要将问题进行分类,所以复合模式思想也可强化算法思路.
|
|
|
|
|
|
|
|
|
|
符合模式中的核心重点是一个 :复合对象,这个复合对象,能同时代表叶子节点和非叶子节点的对接。
|
|
|
|
|
|
|
|
|
|
|
2020-05-02 09:58:55 +03:00
|
|
|
|
现实生活中的出海码头的货运集装箱就是一个很好复合模式的例子,集装箱里面可以装很多包装箱,包装箱里面可以装具体的货物,不论是货还是集装箱本身,对于出海的货运公司来讲都是集装箱,而不是具体的一个类货物,所以的货物都通过大小集装箱复合成统一的集装箱,对货运公司提供统一的使用方式,如下图,整个集装箱构成一棵树.
|
2020-05-01 18:43:34 +03:00
|
|
|
|
|
2020-05-02 09:58:55 +03:00
|
|
|
|
- 集装箱
|
|
|
|
|
- 包装箱A
|
|
|
|
|
- 货物B
|
|
|
|
|
- 包装箱C
|
|
|
|
|
- 货物D
|
2020-05-01 18:43:34 +03:00
|
|
|
|
|
|
|
|
|
![一个示例](../../images/Composite.png)
|
2020-05-01 18:50:04 +03:00
|
|
|
|
|
2020-05-02 09:58:55 +03:00
|
|
|
|
叶子是在集装箱例子中就是具体的物品,它没有能力将其他物品复合进自身。
|
2020-05-01 18:50:04 +03:00
|
|
|
|
|
|
|
|
|
[设计模式之:组合模式(Composite)](https://www.cnblogs.com/dragonflyyi/p/5043144.html)
|