差异聚合,熟人和构图(由Gang Of Four使用)

时间:2014-03-16 11:40:08

标签: oop design-patterns

我一直在阅读设计模式:可重复使用的面向对象软件的元素,并参与了解释aggregationacquaintance的部分。这是一个摘录(对不起,如果它太长了,但我认为解释这个问题很重要):

Consider the distinction between object aggregation and acquaintance and how
differently they manifest themselves at compile- and run-times. Aggregation
implies that one object owns or is responsible for another object. Generally we
speak of an object having or being part of another object. Aggregation implies
that an aggregate object and its owner have identical lifetimes.

Acquaintance implies that an object merely knows of another object. Sometimes
acquaintance is called "association" or the "using" relationship. Acquainted
objects may request operations of each other, but they aren't responsible for
each other. Acquaintance is a weaker relationship than aggregation and suggests
much looser coupling between objects.

...

Ultimately, acquaintance and aggregation are determined more by intent than by
explicit language mechanisms. The distinction may be hard to see in the
compile-time structure, but it's significant. Aggregation relationships tend to
be fewer and more permanent than acquaintance. Acquaintances, in contrast, are
made and remade more frequently, sometimes existing only for the duration of an
operation. Acquaintances are more dynamic as well, making them more difficult
to discern in the source code.

令我感到困惑的是,此处描述的aggregation具有composition - >的特征。编写对象包含/管理其他对象及其生命周期受到约束。

另一方面,该摘录中定义的acquaintance具有aggregation - >的特征。聚合对象只知道对象,但它不管理它们。

也是部分

Sometimes acquaintance is called "association" or the "using" relationship. 

令我感到困惑,因为我认为aggregationcomposition都是association的形式,其中aggregation的耦合程度较低。

作者是指aggregationacquaintance还是compositionaggregation还是我错过了某些内容?

6 个答案:

答案 0 :(得分:4)

我所教的是你写的:

  

作者是否将聚合称为   熟人撰写 聚合或者我遗失了   什么?

是。我的理解是:

  1. 分析视图中,请考虑关联
  2. 设计视图中,更详细地指定每个关联 - 将它们分为两组:
    • 聚合(对象可以独立生活的更自由的关系)和
    • 构成(一个对象负责另一个对象生命周期的关系越紧密)。

答案 1 :(得分:1)

@Honza Zidek绝对正确,要找到更清晰的理解,请使用此链接Association, Aggregation, Composition,

答案 2 :(得分:0)

组合:当一个类由另一个类的数据成员组成时。

Class A
{
   B ObjB;
}

聚合:当类的方法在其范围内创建其他类的对象时

void A::methA()
{
   B* ObjB= new B();
   delete ObjB;
}

Acquintance / Using:当类的方法接受对另一个类的对象的引用作为参数

void A:methA (B& objB) 
{

}

答案 3 :(得分:0)

我现在只能提供聚合的答案。

聚合的关系为“part-of”。例如,车轮是汽车的一部分。没有车轮就不能存在汽车。

答案 4 :(得分:0)

根据我的理解,aggregation指的是全部关系。 acquaintance指的是使用某种关系。与acquaintance相比,此aggregation的关系形式更为弱。假设你为一个实例创建一个对方法/操作中对象的引用。这比aggregation更频繁,持续时间很短。该引用仅在方法返回之前存在,与对象的整个生命周期相反。

答案 5 :(得分:0)

是作者将聚合称为认识,还是将组成称为聚合?我错过了什么吗?

OMT于1991年出版,UML于1997年出版,而书 Design Patterns 则于1994年出版。因此,作者使用OMT aggregation 来指代UML 复合物聚合(又称为“组成” )。

以下是UML定义:

  • 聚合(又称具有 关系)是部分-整个关系,这意味着没有部分(不能是其他部分),就不能存在整体)。该部分是整体的基本属性。例如。汽车(整体)及其引擎(零件)处于聚合状态,因为汽车需要其引擎存在。

  • 另一方面,
  • 关联(又称​​相识关系或使用关系)不是 整体关系。一个对象是另一对象的偶然属性。例如。由于汽车不需要其拥有者,因此汽车与其所有者是有联系的。

注意。 —聚合可以分为两类:共享聚合,其中部分可以不存在整体,而复合聚合(又称​​组成唯一聚集(我喜欢称其为“聚集”),其中一部分不能没有整体而存在。


参考

设计模式:可重用的面向对象软件的元素,作者:Erich Gamma,Richard Helm,Ralph Johnson和John Vlissides。

请考虑对象 aggregation concactance 之间的区别,以及它们在编译时和运行时表现出的差异。聚集意味着一个对象拥有或负责另一个对象。通常,我们所说的对象是具有或是另一个对象的。聚合意味着聚合对象及其所有者具有相同的生存期。

相识意味着一个对象只是知道另一个对象。有时相识被称为“联系”或“使用”关系。熟悉的对象可能会要求彼此进行操作,但彼此之间不承担责任。熟人的关系比聚集的关系弱,并且建议对象之间的耦合要宽松得多。

Peter Grogono和Markku Sakkinen的

复制和比较:问题与解决方案

我们区分对象的必要属性和偶然属性。{脚注:这种区别大致基于亚里士多德的类别。} 基本属性无疑是对象的一部分;偶然属性是另一个对象,它以某种方式与所讨论的对象相关,但不是该对象的一部分。例如,如果所讨论的对象是类Car的实例,我们将认为属性engine是必不可少的,但基本值distanceTravelled和对属性的引用owner是偶然的。 “偶然”和“必要”之间的区分与“参考”和“包含”之间的区分正交。该模型允许所有四种可能性。当一个属性由引用表示时,它是引用对象本身,而不是引用,是偶然的或必不可少的属性。

偶然属性旨在作为关联的概括。关联是“同级之间的结构关系”,其中“同级”是同一概念级别的类。关联是一种偶然的属性,但不是唯一的一种。关联通常被实现为对其他成熟对象的引用,尽管已经提出了更为详尽的实现。但是对象也可能包含计数器,标志,描述符和应用程序软件所需的其他属性,但从概念上讲不是对象的一部分。

本质与偶然之间的区别并不总是显而易见的。根据经验,如果销毁一个对象在逻辑上并不需要销毁另一个对象,则两个对象之间的关系是关联(因此是偶然的),否则一个对象是另一个对象的属性。同样,如果将属性从对象中删除并不会破坏对象的基本完整性,则它是偶然的。