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