`
jefferent
  • 浏览: 80537 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

设计模式(10)——组合模式

 
阅读更多

1. 定义

    组合模式:将对象组织到树结构中,可以用来描述整体与部分的关系。组合模式可以使客户端将单纯元素与复合元素同等看待。

 

    要点:

    (1) 组合模式以不遵守单一责任原则换取透明性,让Client将组合和叶节点一视同仁。

    (2) 在实现组合模式时,有很多设计上的折衷。要根据需求平衡透明性和安全性。

    (3) 有时候系统需要遍历一个树枝构件的子构件很多次,这时候可以把遍历结果缓存起来。

    (4)组合模式的实现中,可以让子对象持有父对象的引用进行反向追溯。

 

2. 类图及描述

    组合模式涉及到三个角色:

  • 抽象构件(Component)角色:这是一个抽象角色,它给参与组合的对象规定一个接口。这个角色给出共有接口及其默认行为。
  • 树叶构件(Leaf)角色:代表参加组合的树叶对象。一个树叶对象没有下级子对象。 
  • 树枝构件(Composite)角色:代表参加组合的有子对象的对象,并给出树枝构件对象的行为。

    透明方式

    作为第一种选择,在Component里面声明所有的用来管理子类对象的方法,包括add()、remove(),以及getChild()方法。这样做的好处是所有的构件类都有相同的接口。在客户端看来,树叶类对象与合成类对象的区别起码在接口层次上消失了,客户端可以同等同的对待所有的对象。这就是透明形式的合成模式。

    这个选择的缺点是不够安全,因为树叶类对象和合成类对象在本质上是有区别的。树叶类对象不可能有下一个层次的对象,因此add()、remove()以及getChild()方法没有意义,是在编译时期不会出错,而只会在运行时期才会出错。

 

    安全方式

    第二种选择是在Composite类里面声明所有的用来管理子类对象的方法。这样的做法是安全的做法,因为树叶类型的对象根本就没有管理子类对象的方法,因此,如果客户端对树叶类对象使用这些方法时,程序会在编译时期出错。

这个选择的缺点是不够透明,因为树叶类和合成类将具有不同的接口。

    这两个形式各有优缺点,需要根据软件的具体情况做出取舍决定。

图 组合模式类图

3. 应用场景及优缺点

 

    适用性

    以下情况使用Composite模式:

    (1)你想表示对象的部分-整体层次结构。

    (2)你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

 

    优点

    (1)组合模式可以很容易的增加新的构件。

    (2)使用组合模式可以使客户端变的很容易设计,因为客户端可以对组合和叶节点一视同仁。

    缺点

    (1)使用组合模式后,控制树枝构件的类型不太容易。

    (2)用继承的方法来增加新的行为很困难。 

 

    使用组合模式时考虑的几个问题:

  • 明显的给出父对象的引用。在子对象里面给出父对象的引用,可以很容易的遍历所有父对象。有了这个引用,可以方便的应用责任链模式。
  • 在通常的系统里,可以使用享元模式实现构件的共享,但是由于组合模式的对象经常要有对父对象的引用,因此共享不容易实现。
  • 有时候系统需要遍历一个树枝结构的子构件很多次,这时候可以考虑把遍历子构件的结果暂时存储在父构件里面作为缓存。
  • 关于使用什么数据类型来存储子对象的问题,在示意性的代码中使用了ArrayList,在实际系统中可以使用其它聚集或数组等。
  • 客户端尽量不要直接调用树叶类中的方法,而是借助其父类(Component)的多态性完成调用,这样可以增加代码的复用性。
分享到:
评论

相关推荐

    java设计模式之——组合模式(结构型模式 )

    NULL 博文链接:https://lvwenwen.iteye.com/blog/1549415

    JAVA设计模式学习10——组合模式

    NULL 博文链接:https://alaric.iteye.com/blog/1910919

    设计模式代码——c#

    C#设计模式(23种设计模式) 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype) 结构型: 6. 适配器...

    C#设计模式—组合模式

    C#设计模式——组合模式应用实例。主要对一款针不同杀毒软件框架的学习。

    设计模式C++实现(7)——外观模式、组合模式[参照].pdf

    设计模式C++实现(7)——外观模式、组合模式[参照].pdf

    设计模式可复用面向对象软件的基础.zip

    2.2.3 组合模式 27 2.3 格式化 27 2.3.1 封装格式化算法 27 2.3.2 Compositor和Composition 27 2.3.3 策略模式 29 2.4 修饰用户界面 29 2.4.1 透明围栏 29 2.4.2 Monoglyph 30 2.4.3 Decorator 模式 32 2.5 支持多种...

    设计模式——基于C#的工程化实现及扩展

    第3篇结构型模式的重点在于如何通过灵活的体系组织不同的对象,并在此基础上完成更为复杂的类型(或者类型系统),而参与组合的各类型之间始终保持尽量松散的结构关系;第4篇行为型模式关注于应用运行过程中算法的...

    设计模式——组合模式

    由于不同地区存在着上下级关系,且会拥有多平级组合,如果采用每个组合主一个类,这样需要创建的类特别多,此时可使用组合模式,如下图: 上图左边可转为右边的递归关系,其原理是把一组相似的对象当作一个单一的...

    Java设计模式 版本2

    对象的克隆——原型模式,复杂对象的组装与创建——建造者模式,不兼容结构的协调——适配器模式,处理多维度变化——桥接模式,树形结构的处理——组合模式,扩展系统功能——装饰模式,深入浅出外观模式,实现对象...

    java设计模式

    目录: 前 言 第一部分 大旗不挥,谁敢冲锋——热身篇 第1章 单一职责原则 1.1 我是“牛”类,我可以担任多职吗 1.2 绝杀技,打破你的传统思维 1.3 我单纯,所以我快乐 1.4 最佳实践 ...附录:23个设计模式

    高等院校专创融合趋势中的组合式教学模式研究——以湖南交通职业技术学院物联网应用技术专业为例.pdf

    高等院校专创融合趋势中的组合式教学模式研究——以湖南交通职业技术学院物联网应用技术专业为例.pdf

    深入浅出设计模式(中文版)

    4.4.2现实中的装饰模式——相架 126 4.4.3C#实例——图书馆中的项目 127 4.4.4Java实例——自定义JButton 131 4.4.5优势和缺陷 133 4.4.6应用情景 134 4.5FacadePattern(外观模式) 134 4.5.1定义 134 4.5.2...

    深入浅出设计模式(中文版电子版)

    4.4.2现实中的装饰模式——相架 126 4.4.3C#实例——图书馆中的项目 127 4.4.4Java实例——自定义JButton 131 4.4.5优势和缺陷 133 4.4.6应用情景 134 4.5FacadePattern(外观模式) 134 4.5.1定义 134 4.5.2...

    24种设计模式介绍与6大设计原则

    结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、...

    设计模式——开发常用的设计模式梳理

    本文来自51cto,文章主要介绍了策略模式、观察者模式、装饰模式、单例模式以及饿汉模式等的相关内容。泛化=实现>组合>聚合>关联>依赖一个人(Person)可以买车(car)和房子(House),那么就可以称:Person类依赖于Car类...

    Python设计模式之组合模式原理与用法实例分析

    本文实例讲述了Python设计模式之组合模式原理与用法。...设计模式——组合模式 组合模式(Composite Pattern):将对象组合成成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用

    设计模式Demo

    结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、...

    软件设计大作业——画板(千万别错过!)

    非常适合该课程的实验作业,功能齐全,包括:各种图形绘制、填充、组合、移动、大小更改、撤销、重构等等还有很多。使用五种以上的设计模式,可塑性强,易于阅读。

    design-pattern-java.pdf

    树形结构的处理——组合模式(二) 树形结构的处理——组合模式(三) 树形结构的处理——组合模式(四) 树形结构的处理——组合模式(五) 装饰模式-Decorator Pattern 扩展系统功能——装饰模式(一) 扩展系统...

    C#23种设计模式_示例源代码及PDF

    解释器模式将描述怎样 在 有了一个简单的文法后, 使用模式设计解释这些语句。 在解释器模式里面提到的语言是指任 何解释器对象能够解释的任何组合。在解释器模式中需要定义一个代表 文法的命令类的等 级结构,也...

Global site tag (gtag.js) - Google Analytics