首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >UML类图符号:关联、聚合和组合之间的区别

UML类图符号:关联、聚合和组合之间的区别
EN

Software Engineering用户
提问于 2014-04-08 21:57:59
回答 3查看 104.5K关注 0票数 48

我对UML类图的一些符号感到困惑。

我很确定我知道联想是什么意思。两个类的实例之间的任何关系,其中一个类的实例需要知道第二个类的一个实例才能执行它的工作-是一个关联关系。关联通常意味着A类具有对B类实例的引用(字段)。

但是,我很难理解聚合和组合箭头的含义。我的部分困惑是因为遇到了对这些符号的不同定义。

聚合符号的两个定义:

定义1:当A类的实例持有B类的实例集合(例如列表、数组等)时,两个类之间的聚合表示法是合适的。

定义2:如果A类的实例包含对B类实例的引用,而B实例依赖于A实例的生命周期,则两个类之间的聚合链接是合适的。意思:当A类的实例被删除时,B类的实例也会被删除,B类的实例完全包含在A类的实例中,而不是A类的实例仅仅拥有对B类实例(这是常规关联)的引用。

关于组合表示法的含义以及它与聚合表示法有何不同,我不确定。

请澄清定义,并帮助我理解。欢迎举出具体的例子。

EN

回答 3

Software Engineering用户

回答已采纳

发布于 2014-04-09 07:02:07

“三联”、“聚合”和“构图”形成了一种尺度,即两类之间有多密切的联系。

在规模的一端,有关联,两个类的对象可以相互了解,但它们不影响彼此的生命周期。对象可以独立存在,哪个A类对象知道哪个B类对象可以随时间而变化。

在天平的另一端,有构图。组合表示一个部分-整体关系,所以B类是A类的一个不可分割的部分。如果A类的对象没有B类对象就不能逻辑地存在,则通常使用这种关系。

聚合关系介于这两个目的之间,但似乎没有人同意确切的位置,因此对于聚合的含义也没有一致的定义。从这个意义上说,你发现的两个定义都是正确的,如果你问了10个人,你就有可能得到11个不同的定义。

票数 35
EN

Software Engineering用户

发布于 2015-09-23 14:45:46

此外,还摘录了当前的UML标准:

11.5.4协会-语义-表示法

...二进制关联的一端可以是聚合= AggregationKind::shared或AggregationKind=AggregationKind::组合。当一端具有聚合= AggregationKind::shared时,会将空心钻石作为终端装饰添加到关联线的末尾,与标记为聚合= AggregationKind::shared的端相对。钻石应明显小于协会的钻石符号。具有聚合=AggregationKind::组合的关联同样在相应的端有一个钻石,但在填充钻石时有所不同。…

9.5.4分类-性质-表示法

…有时使用一个属性来建模环境,其中一个实例用于将一组实例组合在一起;这称为聚合。为了表示这种情况,属性具有一个聚合属性,类型为AggregationKind;代表整个组的实例由属性的所有者分类,代表分组个体的实例按属性的类型分类。AggregationKind是具有以下文字值的枚举:

  • none:表示该属性没有聚合语义。
  • Shared:指示该属性具有共享聚合语义。共享聚合的精确语义因应用领域和建模者而异。
  • 复合:表示属性是复合聚合的,即复合对象负责组合对象的存在和存储(见11.2.3中的部件定义)。复合聚合是一种强大的聚合形式,它要求每次最多在一个复合对象中包含一个部件对象。如果一个复合对象被删除,那么它所有作为对象的部件实例都会随之被删除。

票数 2
EN

Software Engineering用户

发布于 2014-04-09 08:00:59

我已经发了一个关于堆栈溢出的回答

基本上,一个聚合比一个简单的关联强,但是聚合的对象可以像使用一个简单的关联那样“活”在一起。

组合甚至比聚合更强,因为聚合类不能被其他类聚合。它的“寿命”取决于容器。

票数 0
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/235313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档