介绍
组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。
这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。
意图:将对象组合成树形结构以表示”部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
主要解决:它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
何时使用:
- 想表示对象的部分-整体层次结构(树形结构)
- 希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
如何解决: 树枝和叶子实现统一接口,树枝内部组合该接口
关键代码:树枝内部组合该接口,并且含有内部属性List,里面放Component
应用实例:
- 算术表达式包括操作数、操作符和另一个操作数,其中,另一个操作符也可以是操作数、操作符和另一个操作数
- 在 JAVA AWT 和 SWING 中,对于 Button 和 Checkbox 是树叶,Container 是树枝。
优点:
- 高层模块调用简单
- 节点自由增加
缺点:
在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。
简单的来说:就是A类中包含了很多B类,B类中包含了很多C类,然而它们都是一个接口的实现类,可以用一个类来统一操作它们。
- A类中包含课程100、种类5
- B类中包含课程20、种类1
- C类中包含课程3、种类2;
它们的属性及方法是相同的,但是呈现依次包含的关系
组合模式,就是在一个对象中包含其他对象,这些被包含的对象可能是终点对象(不再包含别的对象),也有可能是非终点对象(其内部还包含其他对象,或叫组对象),我们将对象称为节点,即一个根节点包含许多子节点,这些子节点有的不再包含子节点,而有的仍然包含子节点,以此类推。
所谓组合模式,其实说的是对象包含对象的问题,通过组合的方式(在对象内部引用对象)来进行布局,我认为这种组合是区别于继承的,而另一层含义是指树形结构子节点的抽象(将叶子节点与数枝节点抽象为子节点),区别于普通的分别定义叶子节点与数枝节点的方式
实例
创建一个CatalogComponent类,定义一些方法;然后创建两个子类分别继承CatalogComponent类,重写了一些方法,这些方法的参数都是CatalogComponent类型,从而形成了树状组合关系
UML类图
1、创建根节点
1 | public class CatalogComponent { |
可以看到,根节点的各个方法的参数均为根节点类型,这是树状结构的基础
2、创建叶子节点
1 | public class Course extends CatalogComponent { |
各个叶子结点重写了根节点的方法,但是方法参数不会改变。
3、测试组合模式
1 | public class Test { |
4、输出结果
1 | Course Name:Linux课程 Price:11.0 |
参考
- 本文作者: xczll
- 本文链接: https://xczllgit.github.io/2020/03/17/designPattern/2020-03-17-compositePattern/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!