您的位置:首页 > 其它

UML建模学习3:UML基本构造块之关系

2016-04-17 21:16 387 查看
今天我们来看UML基本构造块的另一个要素——关系。

UML中有表示基本图示符号之间的关系,它们是:依赖(dependency)、泛化(generalization,也有的称继承)、实

现(realization)和关联(association),而关联又分为普通关联(common association)、聚合(aggregation,也有的称聚

集)和组合(composition)。

依赖(dependency)

依赖关系表示为一个类A使用另一个类B,这种使用关系是具有偶然性的、临时性的、非常弱的,但是类B的变化

会影响到类A,是use a关系。

表现在生活中,比如某人要过河,需要借用一条船,此时人与船之间的关系就是依赖;表现在代码层面如果类A

依赖于类B,那么类B可以是类A的局部变量,或类A方法的参数,或静态方法的调用。

图示:虚线加箭头(箭头指向的是被依赖的那一方)

举例:



说明:动物有几大特征,比如有新陈代谢,能繁殖。而动物要有生命力,需要氧气、水以及食物等。也就是说,

动物依赖氧气和水。他们之间是依赖关系(dependency),用虚线加箭头来表示。

我们再来看一个代码层面上的例子:



说明:如果两个类有结构关系(关联关系),那么就不用依赖关系(两个事物一般都有这个关系)。

泛化(generalization)

泛化即继承关系。泛化是一种特殊/一般关系,特殊元素(子元素)的对象可替代一般元素(父元素)的对象。用这种

方法,子元素共享了父元素的结构和行为。是is-a关系,具体表现为类与类的继承,接口与接口的继承。

泛化指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功

能的能力,继承是类与类或者接口与接口之间最常见的关系;在Java中此类关系通过关键字extends明确标识,在设

计时一般没有争议性。

图示:实线+空心三角

举例:



实现(realization)

实现是类元之前的语义关系,在该关系中一个类元描述了另一个类元保证实现的契约。实现指的是一个class类实

现interface接口(可以是多个)的功能;实现是类与接口之间最常见的关系;在Java中此类关系通过关键字implements

明确标识,在设计时一般没有争议性。

图示:虚线+空心箭头

举例:



关联(association)

关联描述了两个或多个类之间的结构性关系。表示类与类之间的联接,它使一个类知道另一个类的属性和方法。

关联体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如我和我的朋友;这种关系比依赖更强、不

存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的、关联可以是单向、

双向的;表现在代码层面,假如类A关联了类B,则类B是类A的全局变量(注意是全局变量,再看看上面的依赖关系),

大多数关联都是单向关联,这比较容易维护,关于关联,在生活中我们常会说,类A持有类B的引用。为被关联类B以

类属性的形式出现在关联类A中,也可能是关联类A引用了一个类型为被关联类B的全局变量。

(1)普通关联(common association)

1)Association name名称:用以描述该关系的性质。

2)Role角色:当一个类处于关联的某一端时,该类就在这个关系中扮演了一个特定的角色;角色是关联中靠近它

的一端的类对另外一端的类呈现的职责。

3)Multiplicity多重性:关联角色的多重性是说明一个关联的实例中有多少个相互连接的对象。

图示:直线

举例:



(2)聚合(aggregation)

聚合关系是特殊的关联关系,是一种强的关联关系,他体现的是整体与部分关系,即has-a的关系,但是整体和

部分是可以分离的,注意,是可以分离的。他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多

个整体对象共享;比如计算机CPU、公司与员工的关系等;表现在代码层面,和关联关系是一致的,只能从语义级别

来区分。

普通关联关系的两个类处于同一层次上,是平级的,而聚合关系的两个类处于不同的层次,一个是整体,一个是

部分。同时,是一种弱的“拥有”关系。体现的是A对象可以包含B对象,但B对象不是A对象的组成部分。具体表现为,

如果A由B聚合成,表现为A包含有B的全局对象,但是B对象可以不在A创建的时刻创建,这句话非常有意义,它在代

码中通常体现成依赖注入的setter方法,即A对象可以随时创建B对象,再想想这不就体现了整体和部分是可以分离了

吗?创建整体的时候可以不创建部分。

图示:空心菱形+实线+箭头

举例:



(3)组合(Composition)

组合也是关联关系的一种特例,他体现的是一种contains-a(拥有)的关系,这种关系比聚合更强,也称为强聚

合;它同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周

期结束;比如你和你的大脑;表现在代码层面,和关联关系是一致的,只能从语义级别来区分;表现在代码层面上,

如果A由B组成,那么A就包含B的全局变量,并在创建A的同时创建B,在代码上我们通常是使用构造函数进行实现,

也是依赖注入中构造函数的实现。

图示:实心菱形+实线+箭头

举例:



总结

最后,我们来总结一下,泛化和实现就不用多少了,大家都懂的,就是继承和实现接口,重点说下其它的吧,依

赖,ClassB体现为ClassA的局部变量,我想用就用,用了就有关系,不用就没关系;关联,ClassB体现为ClassA的

全局变量,不管你用不用,反正你知道我的存在了,持有了我的引用。聚合,是特殊的关联关系,用了就加强了关

系,不用还是我只知道你的存在。聚合可以方便的持有多个类的引用,如使用List<>,所以当你发现有List<>等集合

是可以使用聚合来表示,比如观察者模式的结构。组合,体现最强关系,比如人出身了,必定也有头部吧,不然我真

无法想象这个世界了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: