UML中的关系详解

[color=darkred][b]依赖,关联,聚合,组合 阐述的是对象之间一种由弱到强的关系[/b][/color]
弱 强
---------------------------------------->
UML中关系的符合定义
[img]http://dl2.iteye.com/upload/attachment/0092/5786/c8443de6-a921-3971-8df6-449dd6cc06ca.jpg[/img]


下面的的类图给出了各种关系的案例,图截取自《大话设计模式》
[img]http://dl2.iteye.com/upload/attachment/0092/6347/18defb4c-68be-31ae-b81d-902d00c49e88.png[/img]

泛化(Generalization)
父类子类之间的关系,泛化关系用空心三角形 + 实线箭头来表示。
[img]http://dl2.iteye.com/upload/attachment/0092/6353/89b5ead7-8430-36ef-ac29-25aa207ba543.png[/img]

实现接口
实现接口用空心三角形 + 虚线箭头来表示。
[img]http://dl2.iteye.com/upload/attachment/0092/6355/86ea0cc1-e138-3f34-9a25-cd713e0b3c36.png[/img]

关联
当一个类“知道”另一个类时,并且两个类是平等的,无部分-整体之类的特殊关系时,可以用关联(association),通常表现为一个类是另一个类的属性,关联关系用实线或实线箭头表示。对于企鹅和气候两个类,企鹅与气候有很大关联,我们不去讨论为什么北极没有企鹅,为什么它每年要长途跋涉,总之,企鹅需要“知道”气候的变化,需要了解“气候”的规律,它们之间就是一种关联关系。
[img]http://dl2.iteye.com/upload/attachment/0092/6357/bcba7386-f921-3a80-ac7f-74f93e1ad3af.png[/img]


聚合(Aggregation)
表示类之间的关系是“整体-部分”的关系,但表达的是一种弱的“拥有”关系。聚合关系用空心的菱形 + 实线箭头来表示。
[img]http://dl2.iteye.com/upload/attachment/0092/6351/98b85152-21e9-3939-8097-21e353e288e3.png[/img]

组合(Composition)
是一种特殊的聚合关系,是一种强的“拥有”关系,每个部分只能属于一个整体,部分和整体生命周期一样([color=darkred][b]如果说成整体和部分生命周期一样应该是不正确的,不要说反了[/b][/color])。
组合关系用实心的菱形 + 实线箭头来表示,关系的两端还有数字,称为基数,表示关系的这一端的类可以由几个实例,很显然鸟应该有2个翅膀,如果一个类可以由无数个实例,用n来表示。关联关系,聚合关系也是可以由基数的。
[img]http://dl2.iteye.com/upload/attachment/0092/6349/f81d13ef-9dc1-3021-b46a-4b55a3c4d906.png[/img]

依赖(Dependency)
对象之间的临时关系,临时性体现在不超越方法的周期。简单的说,在方法使用到的,如参数类,就一定是依赖关系。在类图中,使用依赖线描述对象之间的全局变量,参数变量,局部变量和静态方法(对其他类的静态方法加以调用)的依赖。

一个事物(独立事物)发生变化会影响使用它的另一个事物(依赖事物),但反之则不然。箭头指向独立事物。

动物需要水,氧气以及食物等,也就是说动物依赖水,氧气,它们之间是依赖关系,用虚线箭头表示。
[img]http://dl2.iteye.com/upload/attachment/0092/6359/9b52bf93-fa56-3f8b-b11c-6d3e370ec66f.png[/img]


组合关系是一种强类型关系,表示部分与整体共存亡,整体和部分有一个不存在,另一个也就不应存在,因此类与类之间的耦合度比较高,而聚合关系表示的是一种弱类型关系,整体和部分都可以单独存在。
案例:鸟儿和鸟儿翅膀之间的关系为组合关系,雁群和大雁之间为聚合关系。

另外两个比较重要的关系是关联和依赖:
关联:简单的可以认为,如果一个类作为了另外一个类的属性,那一定是关联关系。但你要知道,[color=darkred][b]聚合是一种特殊的关联,而组合又是一种特殊的聚合。一般的关联我们认为是平级的、无整体部分关系的,如朋友关系。[/b][/color]

关联和聚合的区别主要在语义上,关联的两个对象之间一般是平等的,例如你是我的朋友,聚合则一般不是平等的,例如一个公司包含了很多员工,其实现上是差不多的。

聚合和组合的区别则在语义和实现上都有差别,组合的两个对象之间其生命期有很大的关联,被组合的对象是在组合对象创建的同时或者创建之后创建,在组合对象销毁之前销毁。一般来说被组合对象不能脱离组合对象独立存在,而且也只能属于一个组合对象,例如一个文档的版本,必须依赖于文档的存在,也只能属于一个文档。聚合则不一样,被聚合的对象可以属于多个聚合对象,例如一个员工可能可以属于多个公司。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值