← 返回首页
设计模式基础教程(三)
发表时间:2021-08-18 01:44:37
类图

1.类与类图

在UML类图中,类一般由三部分组成: 类名:每个类都必须有一个名字,类名是一个字符串。
属性(Attributes):属性是指类的性质,即类的成员变量。类可以有任意多个属性,也可以没有属性。 +表示public -表示private

表示protected

操作(Operations):操作是类的任意一个实例对象都可以使用的行为,操作是类的成员方法。

例如:有以下学生类图。

2.类之间的关系

1)关联关系(association) 关联关系(Association)是类与类之间最常用的一种关系,它是一种结构化关系,用于表示一类对象与另一类对象之间有联系。注意:关联关系体现的是两个类,或者类与接口之间的强依赖关系,这种关系很强烈,比依赖更强,不是偶然性的,也不是临时性的,而是一种长期性,相对平等的关系。

在UML类图中,用实线连接有关联的对象所对应的类,在使用Java、C#和C++等编程语言实现关联关系时,通常将一个类的对象作为另一个类的属性。在使用类图表示关联关系时可以在关联线上标注角色名。

例如:每一个学生有且只有一个身份证。学生和身份证之间就是关联关系,因为这种关系是强关联,学生必须有一张身份证,而身份证必定对应一个学生。如下图所示:

2)聚合关系(aggregation) 聚合关系是关联关系的特例,是强的关联关系,聚合是整个与个体的关系,即has-a关系,此时整体和部分是可以分离的,他们具有各自的生命周期,部分可以属于多个对象,也可以被多个对象共享;比如学生和班级,公司与员工的关系;在代码层面聚合与关联是一致的,只能从语义上来区分。

例如:学生属于一个班级,那么学生和班级就是聚合关系。如下图所示:

3)组合关系(composition) 组合关系(Composition)也是关联关系的一种特例,体现的是一种contain-a关系,比聚合更强,是一种强聚合关系。它同样体现整体与部分的关系,但此时整体与部分是不可分的,整体生命周期的结束也意味着部分生命周期的结束,反之亦然。如大脑和人。在UML中,组合关系用带实心菱形的直线表示。

聚合关系和组合关系的区别简单来讲,组合是一种较为紧密的关系,从生命周期上看,部分和整体是共存亡的关系。聚合则是一种较为松散的关系,部分和整体的生命周期未必一致。

例如:人和大脑就是组合关系,如下图所示:

4)依赖关系(dependency) 依赖关系(Dependency)是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系。大多数情况下,依赖关系体现在某个类的方法使用另一个类的对象作为参数。

依赖关系与关联的区别是依赖是临时性的、非常弱的,可以理解为是一种偶然的关系,而不是必然的关系。

在UML中,依赖关系用带箭头的虚线表示,由依赖的一方指向被依赖的一方。

例如:汽车必须依赖驾驶员才能行使,那么汽车和驾驶员就是依赖关系,如下图所示:

5)泛化关系(generalization) 关系时指一个类(子类、子接口)继承另外一个类(称为父类、父接口)的功能,并可以增加它自己新功能的能力,继承是类与类或者接口与接口最常见的关系,在Java中通过关键字extends来表示。

在UML中,泛化关系用带空心三角形的直线来表示。 例如:动物,人类和学生之间就是一种泛化关系,如下图所示:

6)实现关系(realization) 实现关系是指一个class实现interface接口(一个或者多个),表示类具备了某种能力,实现是类与接口中最常见的关系,在Java中通过implements关键字来表示。

例如:电器都有开和关的功能,电视和电器之间就是实现关系。如下图所示:

以上的关联关系的细化需要注意强弱,由若到强分别是 依赖 < 关联 < 聚合 < 组合。