分享
 
 
 

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

王朝other·作者佚名  2006-01-31
窄屏简体版  字體: |||超大  

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

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

《设计模式》

UML

表示的意义

聚合

组合

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

相识

聚合

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

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

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

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

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

个人评论:

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

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

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

by:kangtian0

e-mail:dunanshan@163.com

QQ:22724092

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

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

示例:存在两个类:Father,Son

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

代码片断:

Father aFather;

Father* pFather;

aFather.get(); //调用Father的get()

pFather = new Son;

pFatehr->get(); //调用Son的get()

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

aFather = *pFather;

aFather.get(); //调用Father的get()

delete pFather;

pFather = NULL;

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有