UML关系
在讲uml关系之间,首先我们要明确一点就是:要从需求分析的角度分析关系,不能从设计者的角度分析关系,否则一开始就会进入误区。
现在我们来讲泛化、依赖、关联、聚合、组合以及它们之间的关系。
1.泛化(Generalization)
表示类与类之间的继承关系,接口与接口之间的继承关系,或类对接口的实现关系。eg.动物和狗。
2.依赖(Dependency)
对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,这两个对象之间主要体现为依赖关系。表现为A使用B完成了某件事,用完以后就和B没关系了。eg.人用计算机计算机了一些数据,这时人和计算机的关系就是依赖。 注意:依赖总是单向的。
3. 关联(Association)
对于两个相对独立的对象,当一个对象的实例与另一个对象的一些特定实例存在固定的对应关系时,这两个对象之间为关联关系。关联可以是双向的,也可以是单向的。
4. 聚合(Aggregation)
指的是整体与部分的关系。通常在定义一个整体类后,再去分析这个整体类的组成结构。从而找出一些组成类,该整体类和组成类之间就形成了聚合关系。需求描述中“包含”、“组成”、“分为…部分”等词常意味着聚合关系。聚合是关联关系的一种,是较强的关联关系,强调的是整体与部分之间的关系。聚合(aggregation)是一种特殊的联系,它表明了“部分”到“整体”的关系,显著的特点就是不能包含循环的联系(就是说,部分中不能包含整体)。只有当子节点不会成为父节点的父节点时(即,必须是树结构,不能是图结构),才能称之为聚合。
5.组合(Composition)
组合(composition)跟聚合几乎相同,唯一的区别就是“部分”不能脱离“整体”单独存在,就是说, “部分”的生命期不能比“整体”还要长。
区别:
1. 关联和依赖
a) 相关联的两个对象之间存在一种稳定的关系,依赖的两个对象只存在使用与被使用的关系,即使用完了,关系就没有了。
b) 要从逻辑上考虑它们的关系,即从语义上可以更好的区分两者的区别。
2. 关联和聚合
a) 聚合关系是关联关系的一种,是强的关联关系。
b) 关联和聚合的区别主要在语义上,关联的两个对象之间一般是平等的,例如你是我的朋友,聚合则一般不是平等的
c) 要从逻辑上考虑它们的关系,即从语义上可以更好的区分两者的区别。聚合是整体和部分的关系。
3. 聚合和组合
a) 聚合关系是“has-a”关系,组合关系是“contains-a” 关系;;聚合关系表示整体与部分的关系比较弱,而组合比较强;聚合关系中代表部分事物的对象与代表聚合事物的对象的生存期无关,一旦删除了聚合对象不一定就删除了代表部分事物的对象。组合中一旦删除了组合对象,同时也就删除了代表部分事物的对象。
b) 在聚合关系中,部分可以独立于聚合而存在,部分的所有权也可以由几个聚合来共享
c) 聚合和组合的区别则在语义和实现上都有差别,组合的两个对象之间其生命期有很大的关联,被组合的对象是在组合对象创建的同时或者创建之后创建,在组合对象销毁之前销毁。一般来说被组合对象不能脱离组合对象独立存在,而且也只能属于一个组合对象,例如一个文档的版本,必须依赖于文档的存在,也只能属于一个文档。聚合则不一样,被聚合的对象可以属于多个聚合对象,例如一个员工可能可以属于多个公司。
d) eg.
你和你的心脏之间是composition关系(心脏只属于你自己)
你和你买的书之间是aggregation关系(书可能是别人的)
你和你的朋友之间是association关系