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