UML中类图之间的关系有许多种,我们在使用画图工具画图时常常会因为不了解类图之间的关系而导致类图画的不够准确,不能高效简单地表达开发需求,学的时候就有点模模糊糊,傻傻分不清楚,现在UML画图文档(结合机房收费系统)已经画完,感觉对于类图中的关系要搞清楚,类图用于描述系统中所包含的类以及它们之间的相互关系,帮助人们简化对系统的理解,它是系统分析和设计阶段的重要产物,也是系统编码和测试的重要模型依据,由此可知,类图的关系是至关重要的,我们需要用最准确的建模语言来描述。
关联关系是类与类之间的连接,它使一个类知道另一个类的属性和方法,指明了事物的对象之间的联系,如:教师与学生、雇员与雇主。
关联是模型元素间的一种结构联系,用于表示一类对象与另一类对象之间有联系。
可以是单向和双向。
根据关联导航方向又分为单向关联、双向关联;使用导航性可以降低类间的耦合度,描述一个对象通过链进行导航访问另一个对象。
在类图使用带箭头的实线表示,箭头从使用类指向被关联的类;
有一个箭头,表示关联的方向。表示A与B是单相识关系,A知道B,只有一方(A)可以调用另一方(B)的公共属性,而另一方(B)对这一方(A)一无所知,也就是说只有A知道这种联系的存在。
例如:顾客(Customer)拥有地址(Address),则Customer类与Address类具有单向关联关系。
多数默认情况下,关联是双向的。表示A与B是相知关系,A和B相互了解,双方都知道对方的存在,都可以调用对方的公共属性和方法。
例如:顾客(Customer)和商品(Product)之间的关系。顾客购买商品并拥有商品,卖出的商品与某个顾客之间相互关联,他们之间是双向关联的关系。
对关联进行修饰又有自身关联和多重性关联等。
在系统中可能会存在一些类的属性对象类型为该类本身,这种特殊的关联关系称为自身关联。
例如:组成一辆汽车的零件类的成员又是零件类型的对象。
多重性关联关系又称为重数性关联关系,表示一个类的对象与另一个类的对象连接的个数,在UML中多重性关系可以直接在关联直线上增加一个数字表示与之对应的另一个类的对象的个数。
例如:一个雇主(Employer)可以雇佣一个或多个雇员(Employee),一个雇员可以为不同的雇主服务,因此,一个雇主(Employer)类的对象可以与一个或多个雇员(Employee)类的对象相互关联,一个雇员(Emplyee)的对象可以与1个或多个雇主(Employer)类的对象相关联。
聚合关系表示部分与整体的关系,但是这种关系较于组合(Composition)来说较弱。部分与整体可以具有不同的生存期,部分是整体的一部分,但是部分在脱离整体之后还可以独立存在,有自己的属性和方法。
例如:一台电脑(Computer)包括显示器(Moniter)、鼠标(Mouse)、键盘(Keyboard)、主机(Host),一台电脑可以喝多个鼠标、多个键盘、多个显示器相搭配,并不是成套存在的,显示器可以选择任一键盘、鼠标、主机等组成电脑,当鼠标、键盘、主机、显示器脱离这台电脑还可以单独存在,换言之,它们还具有自己的生命周期, 此时的电脑就不叫电脑了,但是鼠标还是鼠标,鼠标还可以作为另一台电脑的一部分。
组合关系表示的也是整体和部分的关系,关系较为紧密,部分和整体具有共同的生命周期,可以说部分的生命周期是依据整体的生命周期而定的,当整体灭亡的时候部分也就不复存在了,在时间上有很严格的约束,先有整体才有个体,是很强的部分和整体关系,部分和整体共存亡。写到这里想到一个成语“唇亡齿寒”,它常用来比喻双方休戚相关,荣辱与共。
例如:人(Person)和头(Head)的关系就是组合关系,如果人没了,头也就没了,头是在人存在的基础上存在的,人和脑袋有共同的生命周期,如果脑袋从人身上分离出去了,头就无法运行进而失去作用。
组合(Composition)和聚合(Aggregation)的比较,用一张图来说明:
依赖关系是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系。假设A类的变化引起了B类的变化,则说明B类依赖于A类。
例如:用户(User)使用网站(Website)完成信息浏览等事情,如果某一天百度网站需要进行网站维护或升级,用户就不能再使用网站做有关的事情了,网站的变化引起了用户的变化,说明了用户依赖于网站。
(1)依赖是一种弱关联,只要一个类用到了另一个类,但是和另一个类的关系不是太明显的时候,就可以把这种关系看成是依赖,表现为一个对象仅仅是调用了另一个对象的服务,具有偶然性、临时性。比如:我和船,我和船本来是没关系的,但是当我有一次需要过河时,我需要借用一条船来渡我过河,我和船之间就是依赖关系,我依赖船完成过河这件事情。
关联是一种结构关系,表现为一个对象能够获得另一个对象的实例引用并调用它的服务,它们之间存在固定的对应关系,具有必然性。比如:自行车和自行车的主人,每辆自行车对应特定的主人,每辆车自行车属于特定的主人,每个主人有自己特定的自行车,主人每天骑着自己的自行车出行,自行车的主人和自行车之间就是关联关系。
(2)依赖是对象间短暂的一种关系,在这个短暂的关系中,被调用类表现为调用类的局部变量、方法的参数、以及调用类调用被调用类的静态放大,这些情况下,调用类和被调用类就属于依赖关系。
关联是对象间长期的一种关系, 在这个长期的关系中,被调用类表现为调用类的引用、或者调用类的属性,这些情况下,调用类和被调用类之间就属于关联关系。
比如:司机(Driver)和汽车(Car)
用依赖关系来表示:类Driver中存在一个属性Car car
用关联关系来表示:类Car 的实例可能存在于某个方法调用的参数中,或某个方法的局部变量中
这几种关系所表现的强弱程度依次为:组合>聚合>关联>依赖
类图是其他几种图的基础,正确表达出类与类之间的关系,不能只用依赖关系,能用组合就不用聚合,能用聚合就不用一般关联,能用一般关联就不要用依赖。这对于后续开发工作的进行非常重要。
如有不合适之处,请大家多多指教,欢迎留言~~