go-pattern-examples/structure/05_composite/README.md

29 lines
2.1 KiB
Markdown
Raw Permalink Normal View History

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)