Composite 组合模式

动机

程序经常需要操作树形数据结构,而且需要同等对待分支和叶子节点。我们来思考下一个文件管理系统。文件管理系统是由分支(文件夹)和叶子节点(文件)组成的树形结构。注意,一个文件夹通常包含一个或多个文件或文件夹,这样的是一个复杂对象;相对地,文件是简单对象。我们还注意到由于文件和文件夹的很多操作和属性都是一样的,比如移动、复制、列出文件或文件夹的属性(如名称和大小);那么要是我们定义一个文件系统资源接口来把文件和文件夹对象统一对待,操作上就会方便很多。

目的

  • 此模式的目的就是为了将对象组合成树形结构,以此来表示部分-整体的层级
  • 组合使得客户端能一致地对待单个对象和对象组合

实现

composite pattern uml

示例代码

  • Component - 组件接口是叶子节点和复合的抽象。它定义了复合内对象必须实现的接口。比如说文件系统资源为文件和文件夹定义了移动、复制、重命名和获取大小的方法。
  • Leaf - 叶子节点是那些没有子元素的对象。它们实现了 Component 接口定义的服务。比如一个文件对象实现了移动、复制、重命名等 Component 接口里的相关行为
  • Composite 复合对象存储子元素外还实现了 Component 中定义的行为。复合通过将行为委托给子组件的方式来实现 Component 中的方法。此外,复合对象还提供了新增、移除和获取子组件的方法。
  • Client 客户端通过 Component 接口操作处于层级中的对象

如果客户端需要对所有节点执行操作,而且不管节点到底是分支还是叶子节点。那么客户端只需要通过 component 接口持有所需节点的引用,然后通过这个接口机进行处理就行了。

应用场景 & 例子

组合模式适用于存在部分-整体的层次结构,并且客户端需要一致地对对象进行处理而不管对象是分支还是叶子节点。

例子 - 图形编辑器

在图形编辑器中,图形可以是基本的也可以是复杂的。举例来说,直线是简单的图形,矩形是由四条直线组成的复杂图形。由于各种图形有许多一样的操作,如渲染到屏幕上;而且图形遵循着部分-整体的层次结构,组合模式就能用来让程序一致地处理所有图形的行为。

例子中各角色定义如下:

  • Shape (Component) - 图形是直线、矩形(叶子节点)或其他复杂图形(复合对象)的抽象
  • Line,Rectangle(Leafs) - 无子元素的对象。它们实现接口 Shape 中描述的行为
  • ComplexShape (Composite) - 持有子 Shape 的复合对象,此外还实现了接口 Shape 中定义的方法
  • GraphicEditor (Client) - 图形编辑器操作层次结构中的图形 Shape
    另一种实现: 在前面的例子中,我们没有通过接口 Shape 来组合对象,而是在复合对象中特殊处理。为了避免这种情况,并进一步加强操作的一致性,我们将组件的新增、移除和获取操作上升到接口 Shape 中定义,uml 如下:
composite pattern uml2

总结

  • 组合模式定义由简单对象和复合对象组成的类层次。简单对象可组合成更复杂的复合对象,相应地复合对象可以继续组成更复杂的复合对象
  • 客户端可一致地对待简单对象和复合对象,使用 component 接口使得客户端代码保持简洁
  • 客户端通过统一的 component 接口处理组件,所以可以添加新的组件会比较容易,不用修改客户端代码

相关模式

Decorator Patterm 装饰者模式经常和组合模式一起使用。当装饰者和组合模式一起使用的时候,它们将有一个共同的父类。然后装饰者对象需要支持组合模式的组件接口 Component ,如 Add, Remove 和 GetChild。

目录 //www.greatytc.com/p/af861220a6cc

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,042评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,996评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,674评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,340评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,404评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,749评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,902评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,662评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,110评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,577评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,258评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,848评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,726评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,952评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,271评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,452评论 2 348

推荐阅读更多精彩内容