目录
- 从生活场景出发,映射组合模式
- 组合模式的理论概念
- 组合模式的实现
- 组合模式在源码中的应用
- 组合 “优于” 继承
从生活场景出发,映射组合模式
- 轮船上的集装箱
- 集装箱内的盒子
情景说明:海运轮船上有很多集装箱
,集装箱里面又装满了更小的包装箱
。一般情况下,集装箱
与集装箱
单独排列组合。包装箱
与包装箱
单独排列组合。虽然如此,但并不妨碍现实生活中在集装箱
旁边放许多个包装箱
。
这里我们不探讨,如何装配可以装入更多的箱子问题。有兴趣的同学,自行百度百科>>装箱问题。
设计模式某些时候就是映射生活中的最佳实践,就像上面的生活场景一样。我们需要使用软件设计思想将其表达出来,在这里组合模式就显得很合适了。在继续之前我先梳理下组合模式的理论知识,以确保在讲实现的时候会比较自然。
组合模式的理论概念
组合模式的定义:将对象组合成树形结构(如上面两幅图)以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
组合模式的目的:让客户端不再区分操作的是组合对象还是叶子对象,而是以一个统一的方式来操作。
-
何时备选用组合模式:
- 如果你想表示对象的部分-整体层次结构时。
- 如果你希望统一的使用组合对象中的所有对象。
组合模式的实现
在集装箱问题上,我们先抽象出容器的概念。无论是集装箱,还是包装箱都隶属于容器的范畴。容器可以装物品,也可以装更小容器。一个容器在生活是用来装物品,还是用来装容器这个也全凭客户的喜好。
先对问题进行分析,抽象出如下几个角色。
角色 | 能力描述 |
---|---|
容器 | 具备载物能力 |
容器(集装箱) | 具备强大的载物能力 |
容器(包装箱) | 具备较小的载物能力 |
容器(航海货轮) | 神一样的载物能力 |
实体 | 不具备载物能力 |
客户端(暴发户小张) | 有钱任性 |
场景演练:
- 暴发户小张,买了一艘货轮用来给自己搬家。
- 暴发户小张指挥工人,把实体搬进集装箱。
- 暴发户小张指挥吊车,把集装箱搬进货轮。
- 暴发户小张开走了货轮,中途撞冰山沉了……
TODO ://
组合模式在源码中的应用
TODO ://
组合 “优于” 继承
TODO ://