“组合” “聚合” “相识” 在不同场合下的意义和关系——《设计模式》读后感

原创 2005年05月26日 11:38:00

       确切的说,这几个概念在中文版的书中使用很混乱,也让我走了不少弯路。所以这里把我的一些理解拿出来和大家讨论一下。这里主要是从一本书(《设计模式——可复用面向对象软件的基础》)和一种面向对象设计的表示方法(UML)来讨论这个问题。


       首先要说明的是概念。《设计模式》一书中没有使用“组合”这个概念,而UML表示中一般没有使用“相识”这个概念。但是两者实际上存在如下的对应关系:

《设计模式》

UML

表示的意义

聚合

组合

聚合/组合 对象和其所有者具有相同的生命周期

相识

聚合

一个对象仅仅知道另一个对象

不过,这个对应关系也不是绝对的。

1、  UML中还有一种关系叫“关联”,《设计模式》中对这种关系的说明很准确:“OMT还定义了类间的关联(association)关系,以类间的一条线来表示。关联关系是双向的。虽然在分析阶段这种关系是适用的,但我们觉得它对于描述设计模式内的类关系来说显得太抽象了,因为在设计阶段关联关系必须被映射为对象引用或指针。对象引用本身就是有向的,更适合表达我们所讨论的那种关系。”也可以说“关联”到代码的映射是一对多的,并且这种一对多的关系会影响到模式的选择。

2、  UML中“组合”“聚合”的概念是用来表示对象的静态结构的,因此我们可以这样认为:“组合”就是用成员变量实现的,而“聚合”就是用指向某个对象的指针来实现的。当然,这里略去了对成员函数的参数的考虑。

3、  《设计模式》中对“聚合”和“相识”的关系描述如下:“C++中,聚合可以通过定义表示真正实例的成员变量来实现,但更通常的是将这些成员变量定义为实例指针或引用;相识也是以指针或引用来实现。”“从根本上讲,是聚合还是相识是由你的意图而不是由显式的语言机制决定的。”通过这两个说明,可以看到《设计模式》中认为“聚合”和“相识”关系是运行时的动态特性,从这点上来说和UML有本质的区别。             另外,《设计模式》中对这两者动态特性描述如下:“聚合关系使用较少且比相识关系更持久;而相识关系则出现频率较高,但有时只存在于一个操作期间,相识也更具动态性,使得它在源代码中更难被辨别出来。”显然,这种描述只是说到了量的问题,而没有说到质的问题,从这里还是看不出“聚合”和“相识”到底在运行时有什么本质不同。



个人评论:

       类图是一种静态结构,故应该展示在类的结构上的区别,所以UML的表示要优于《设计模式》中的表示。这是《设计模式》表达上的一个很大的败笔!


       《设计模式》关注的更多的是系统运行时对象之间的交互,几乎所有模式都使用了多态,可以说是一个多态使用大全。


       在看《设计模式》前,我认为系统是由类组成,看后认为系统是由对象组成。这应该属于两种不同的层次:前者是静态的理解,后者是真正使用面向对象思想动态的理解系统。


bykangtian0

附:C++中对多态支持的一般实现方法

       一般来说,一个对象生成时,会在对象中增加一个由编译器加入的_vfptr指针,这个指针指向一个函数指针数组,对应的函数地址就是虚函数的地址。并且_vfptr指向的内容只在两个时候会改变:1、对象构造时;2、对象析构时。因此,其它所有操作虽然会影响对象的状态,但是不会改变_vfptr指向的内容。

示例:存在两个类:FatherSon

Father有虚函数get(),Son重定义这个虚函数get()

代码片断:

Father aFather;

Father* pFather;

aFather.get();  //调用Fatherget()

pFather = new Son;

pFatehr->get();      //调用Songet()

//最重要的:除了构造和析构,不改变_vfptr指向的内容,所以aFather最多只是状态会变化

aFather = *pFather;             

aFather.get();  //调用Fatherget()

delete pFather;

pFather = NULL;

23种设计模式-依赖、关联、聚合和组合之间区别的理解

在学习面向对象设计对象关系时,依赖、关联、聚合和组合这四种关系之间区别比较容易混淆。特别是后三种,仅仅是在语义上有所区别,所谓语义就是指上下文环境、特定情景等。他们在编程语言中的体现却是基本相同的,但...
  • a925907195
  • a925907195
  • 2014年12月17日 15:47
  • 3116

设计模式六种关系:依赖、关联、聚合、组合、继承和实现

设计模式六种关系:依赖、关联、聚合、组合、继承和实现在面向对象设计模式中,类与类之间主要有6种关系,他们分别是:依赖、关联、聚合、组合、继承、实现。他们的耦合度依次增强依赖、关联、聚合和组合之间区别•...
  • cadenzasolo
  • cadenzasolo
  • 2016年01月23日 15:00
  • 1835

设计模式中“组合” “聚合” “相识” 在不同场合下的意义和关系

确切的说,这几个概念在中文版的书中使用很混乱,也让我走了不少弯路。所以这里把我的一些理解拿出来和大家讨论一下。这里主要是从一本书(《设计模式——可复用面向对象软件的基础》)和一种面向对象设计的表示方法...
  • lejuo
  • lejuo
  • 2013年08月30日 16:28
  • 1343

聚合和组合的关系(设计模式)

聚合:指的是整体与部分的关系。通常在定义一个整体类后,再去分析这个整体类的组成结构。从而找出一些组成类,该整体类和组成类之间就形成了聚合关系。例如一个航母编队包括海空母舰、驱护舰艇、舰载飞机及核动力攻...
  • zhubosa
  • zhubosa
  • 2014年04月29日 13:20
  • 1849

依赖、关联、聚合和组合及其之间区别的简单理解

在java以及其他的面向对象设计模式中,类与类之间主要有6种关系,他们分别是:依赖、关联、聚合、组合、继承、实现。他们的耦合度依次增强。 1. 依赖(Dependence)         依赖关...
  • zhou1519
  • zhou1519
  • 2014年03月28日 21:35
  • 1166

设计模式-----OMT表示法

1. 对象:最上面的黑体表示类名,下面依次是操作,数据。 2.实例化:虚线箭头表示一个类实例化另外一个对象。 3 .继承:竖线和三角表示继承关系。 4.委托 委托是一种...
  • lifajin
  • lifajin
  • 2012年06月07日 10:23
  • 803

聚合VS组合的代码实现过程

构造函数,你写与不写,都在那里!
  • lfh15732626246
  • lfh15732626246
  • 2016年06月05日 10:30
  • 1035

uml的关联关系中聚合与组合的区别

什么是关联关系? 在UML中,关联关系是描述了类的结构之间的关系。具有方向、名字、角色和多重性等信息。 一般的关联关系语义较弱。也有两种语义较强,分别是聚合与组合。       什么是聚合关系? 一...
  • qq_20026579
  • qq_20026579
  • 2016年04月26日 20:39
  • 799

Java中组合与聚合的区别

今日得闲,拿来一直放着的《Thinking in Java》来看,前面就说到组合跟聚合,之前看过现在也记了,上网查了一下,大家说的都有道理。李笑来老师说过,一个好的类比对于正确的理解和实践某个事物是非...
  • baidu_25555389
  • baidu_25555389
  • 2017年06月30日 17:43
  • 658

UML中聚合和组合的关系

本文转载自:聚合和组合的关系(设计模式) 聚合:指的是整体与部分的关系。通常在定义一个整体类后,再去分析这个整体类的组成结构。从而找出一些组成类,该整体类和组成类之间就形成了聚合关系。例如一个航母编队...
  • gongxifacai_believe
  • gongxifacai_believe
  • 2016年03月14日 18:15
  • 1244
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:“组合” “聚合” “相识” 在不同场合下的意义和关系——《设计模式》读后感
举报原因:
原因补充:

(最多只允许输入30个字)