关系是事物间的连接。在面向对象建模中,最重要的关系是依赖,泛化,关联。
依赖(Dependencies)是这样一个关系,一个事物使用另一个事物的信息和服务。
最常见的类间的依赖是,一个类调用了另一类的的方法或者一个类使用了另一类作为类型的变量/参数。
泛化(Generalizations)是这样一个关系,一个一般的事物(超类,父类)和一个更特殊的事物(子类)。泛化是“is-a-kind-of”关系。
关联(Associations)是一个结构关系,它指定了一个类的实例连接到另一个类的实例。从类的关联,你可以导出对象的关联。一个类可以关联到自己,也就是说给定一个类的对象,你可以关联到该类的其它对象。两个类的关联叫做二元关联,多于两个类间的关联叫做多元关联。
除了这几种基本的形式外,还有4中应用于关联的修饰:
名称
关联可以有一个名称,用以描述该关系的性质。为了消除名称的歧义,可以提供一个三角形指出读名称的方向。
注意: 1. 不要把关联的名称的方向和关联导航混淆 2. startUML2如何表示名称的方向??
角色
当一个类参与了一个关联时,它就在这个关系中扮演了一个特定的角色(Role)。可以显式地命名一个类在关联中所扮演的角色,把关联端点扮演的角色称为端名(end name)。
多重性
关联的多重性(Multiplicity)说明了一个关联的实例中有多少个相互连接的对象。表示多重性的数值可能是一个(1),零个或一个(0..1),多个(0..*
,等价于*
,可能是0个),一个或多个(1..*,不包含0个),可以给出它的一个整数范围(2..5),甚至是一个数值(3)。
聚合与组合
两个类之间的简单关联表示了两个同等地位的类之间的结构关系,这意味着两个类在概念上是同级别的,一个类并不比另外一个类更重要。
聚合(Aggregation)是一种特殊的关联,一个类描述了一个较大的事物(整体),它由较小的事物(部分)组成。聚合描述了”has-a”关系,整体对象拥有部分对象。聚合完全是概念性的,只是为了区分整体和部分,整体和部分的生命周期是没有相关性的。
组合(Composition)是聚合的变体,描述了”part-of”关系。整体和部分之间拥有强关系而且它们的生命周期是一致的。整体创建了之后,部分创建,一旦部分创建了之后,它们同生共死,当然整体可以在销毁之前主动销毁部分。
这意味着,在组合关系中,作为部分的对象只能作为一个整体的一部分,但是聚合不同,部分可能是多个整体共享的。在组合关系中,整体负责管理部分的创建和销毁。类和类的属性间的关系就是一种典型的组合关系。
在举另外一个例子,实例代码如下:
Car和Engine是组合关系,Car的生命周期和Engine的是一致的,Car的对象回收了,Engine的对象也会被回收,当然,你可以在Car的某个方法中主动销毁Engine。Engine只能作为Car的一部分。
Person和Address是聚合关系,Address对象的创建独立于Person对象,Person对象回收了,Address对象可以不回收,还可以把该Address对象给其它的对象。
Car.java文件:
package com.dc.uml;/** * Demo UML 组合关系 * Car的生命周期和Engine的是一致的,Car的对象回收了,Engine的对象也会被回收, * 当然,你可以在Car的某个方法中主动销毁Engine。 * Engine只能作为Car的一部分。 */public class Car { PRivate Engine mEngine; public Car() { mEngine = new Engine(); }}class Engine { public Engine(){ System.out.println("create Engine"); }}Person.java文件:
package com.dc.uml;/** * Demo UML 聚合关系 * Address对象的创建独立于Person对象, * Person对象回收了,Address对象可以不回收, * 还可以把该Address对象给其它的对象。 */public class Person { private Address mAddress; public Person(Address addr) { mAddress = addr; }}class Address { private String mCity; public Address(String city) { mCity = city; }}CompositionAggregationTest.java文件:
package com.dc.uml;public class CompositionAggregationTest { public static void main(String[] args) { // Composition demo Car car = new Car(); // Aggregation demo Address addressSH = new Address("ShangHai"); Person personA = new Person(addressSH); }}UML类图如下:
新闻热点
疑难解答