![0a50ad4c020681152ab0dbea6a3a9108.png](https://i-blog.csdnimg.cn/blog_migrate/b8239a44665c2a11ff845fd9816f684d.jpeg)
总第54篇
在第53篇中,我们已经对设计模式进行了系统性的介绍,为了更好地理解设计模式,本文将对UML(Unified Modeling Language)
描述的类图关系进行详细地介绍,并对其相应的符号表示方法进行归纳。
1.面向对象中的类间关系
在进行面向对象
系统设计时,我需要根据系统的需求来抽象出一些类,并设计类与类之间的关系,这就是我们常说的业务建模。设计优良的类间关系是我们实现“高内聚、低耦合”系统的前提条件,这里就来详细总结梳理一下各种类间关系和它们之间的区别与联系。
A.继承
继承是指一个类(称为子类或子接口)继承另外一个类(称为父类或父接口)的功能,并可以增加它自己新功能的能力。继承是类与类或者接口与接口间最常见的关系。如果继承的父类是抽象类,并且父类中有抽象方法,那么,抽象方法必须在子类中实现。
B.实现
实现是指一个类实现接口的功能,它是类与接口之间最常见的关系。
C.依赖
依赖是指两个独立的对象,当一个对象负责构造另一个对象实例,或者依赖另一个对象的服务时,这两个对象间体现为依赖关系。简单来说,就是一个类A
使用到了类B
,而这种使用关系具有偶然性、临时性的弱关系,但是类B
的改变会影响到类A
。比如,我们写代码要用电脑,此时人与电脑间的关系就是依赖关系。在代码层面表现为, 类B
作为类方法参数、或方法中的局部变量、或静态方法,被类A
使用。
D.关联
关联体现为两个类或者类与接口间语义级别上的一种强依赖关系,这种关系比依赖更强,不是偶然性与临时性的,而是长期的,关联双方平等的。关联关系分为单向关联和双向关联。单向关联表现为:类A
中使用了类B
,其中类B
作为类A
的成员变量;双向关联表现为:类A
中使用了类B
作为成员变量,同时类B
中也使用了类A
作为成员变量。
E.聚合
聚合是关联关系的一种特例,耦合度强于关联,它体现的是整体与部分、占有(has-a
)的关系。此时,整体与局部之间是可以分离的,它们可以具有各自的生命周期,部分可以属于多个整体对象,也可以被多个整体对象所共享。在代码层面上,聚合与关联是一样的,仅在语义上有所区别,关联关系的对象间是相互独立的,而聚合关系的对象间存在包含关系。
F.组合
组合也是关联关系的一种特例,是比聚合的耦合度更强的关联关系,故也称为强聚合,它同样体现的整体与部分、必有(contains-a
)的关系,但此时的整体与部分是不可分割的,整体的生命周期与部分的生命周期一致,共生共死,并且部分单独存在时没有任何意义。在代码层面上,组合与关联也是一样的,仅在语义上有所区别。
对于继承和实现,这两种关系体现的类与类、或者类与接口间的纵向关系;另外四种关系则体现的类与类、或者类与接口间的横向、引用关系,是比较难区分的,有些关系仅能从语义上进行区分,但总的来说,这四种关系所表现的强弱程度依次为:组合>聚合>关联>依赖。
2.UML
类图关系及其区别
A.类
类在UML图
中包含三个组成部分:类名、类的成员变量(属性)和类的方法。其中,属性和方法前可以加修饰符,加号+
表示具有public
可见性,减号-
表示具有private
可见性,井号#
表示具有protected
可见性。 如果属性和方法具有下划线,表明它是静态的,如下图示例。第一层显示类的名称,若是抽象类,用斜体显示;第二层是成员变量(属性);第三层是类方法。
![413219540c002bbaf79ae53edc0b2a85.png](https://i-blog.csdnimg.cn/blog_migrate/de8a7a0bda13cf4acf5061b30c73e3cb.png)
B.包
在UML图
中,一个包直接对应于Java
中的一个包, 在Java
中,一个包可能包含其他包、类或者同时含有这两者。在进行建模时,系统会有逻辑性的包对你的模型进行组织,你还会拥有物理性的包,它将直接转换成系统中的Java
包,包名称即是对这个包的唯一标识。
![bf5407cb1f6f78cc78834d608a2941ec.png](https://i-blog.csdnimg.cn/blog_migrate/decf7f8618a979c893979319f3641d60.png)
C.接口
接口是一系列操作的集合,它指定了一个类所提供的服务,它直接对应Java
中的一个标准类型 ,接口在UML图
中可以用下图所示表示,也可以用附加了<<interface>>
的标准类来表示。 如图所示,第一层是接口名称,第二层是接口方法。
![3b83dcc848ae269a91f8ffdfe2cf04da.png](https://i-blog.csdnimg.cn/blog_migrate/05ef4080f24f6754f9e799ab9f75d107.png)
D.泛化(继承)
泛化表示一个泛化的元素与一个更具体的元素间的关系,用于对继承关系进行建模,如下图所示,用空心三角形+实线
来表示。
![27c3788be076eec3a379f3b5f992e1cc.png](https://i-blog.csdnimg.cn/blog_migrate/a4ba9205130a18479915ba2259cc64ce.png)
E.实现
在UML
类图关系中,实现关系将一种模型元素与另一种模型元素连接起来,其中接口只是行为的说明。如图所示,用空心三角+虚线
表示。
![f4bd66f1b584e09b01910f79f33cafe2.png](https://i-blog.csdnimg.cn/blog_migrate/7080ec3db2d6f420ccec6521adc77e2b.png)
F.依赖
UML
类图关系中,依赖表示两个或多个模型元素间语义上的关系, 它表示:提供者的某此变化会要求或指示依赖关系中的客体的变化。如图所示,用虚线箭头
表示。
![c1819e119d19800f1421b4c17e612842.png](https://i-blog.csdnimg.cn/blog_migrate/c95ffe701d57b914f63c2e46286ee6d6.png)
G.关联
UML类图
关系中,关联描述了系统中对象或实例间的离散连接,关联带有系统中各个对象之间关系的信息。 如下图所示,用实线箭头
表示,其中箭头是可选的,它用于指定导航能力。如果没有箭头,暗示一种双向导航能力,其后面的数字是多重性修饰符,暗示实例间的关系。比如,下图中Employee
可以有0个或更多的TimeCard
对象,而每个TimeCard
只能从属于单独一个Employee
。
![c6d83156afb145e909959cd6f8db80c8.png](https://i-blog.csdnimg.cn/blog_migrate/2c1c2c5e05b82d06912716758791b1e0.png)
H.聚合
聚合是关联关系的一种特例,代表两个类间的整体与局部关系。聚合是has-a
关系,这暗示着 UML类图
中不存在回路,即只能是一种单向关系。如下图所示,用空心菱形+实线箭头
表示。
![c20390586d28f3bda7f5f8829e3e0351.png](https://i-blog.csdnimg.cn/blog_migrate/e657d9464ad90ba4bd648a062d68731c.png)
I.组合
组合也是关联的一种特例,是contains-a
关系, 整体与部分有相同的生命周期,部分不可与其它整体共享。如下图所示,用实心菱形+实线箭头
表示。
![7e771544266719c628e9d85dc666e7ac.png](https://i-blog.csdnimg.cn/blog_migrate/8050d5335e4e563a8e24ae7d20dced1f.png)
通过理解类间的各种关系以及这些关系在UML类图
中的表示方法,你将可以更好地学习设计模式,更好地完成你自己的软件设计。
本文到此结束!下篇继续!
如果对你有帮助,请随手 点赞 或 赞赏!关注本专栏,更多干货与你分享。
=======================================================
欢迎【关注、私信 @武三郎】。我们一起交流一起进步。