UML建模<第三篇>:类图

2020-05-02  本文已影响0人  NoBugException
图片.png

类图(Class Diagram)是面向对象系统建模中最常用和最重要的图。主要是用来显示系统中的类、接口以及它们之间的静态结构和关系的一种静态模型。是唯一可以直接映射到面向对象的语言。
本文使用PowerDesigner 16绘制类图。

目的

[一] 分析和设计应用程序的静态视图。
[二] 描述一个系统的责任。
[三] 基地组件图和部署图。
[四] 正向和逆向工程。

正向工程是通过从特定实现语言的映射而把模型转换为代码的过程。
逆向工程是通过从特定实现语言的映射而把代码转换为模型的过程。

主要元素

类(class)、接口(interface)、端口(port)、关联关系(Association)、依赖(Dependency)、聚合(Aggregation)、组合(Composition)

端口(Port):类元与外部部件交互的连接处。用类元边框线上的小矩形框标识类元一般都是以封闭的结构体,在组合结构图中通过端口与外部交互。

主要关系

泛化(Generalization)

是一种继承关系, 表示一般与特殊的关系, 它指定了子类如何特化父类的所有特征和行为. 例如:老虎是动物的一种, 即有老虎的特性也有动物的共性.

实现(Realization)

是一种类与接口的关系, 表示类是接口所有特征和行为的实现.

关联(Association)(引用)

是一种拥有的关系, 它使一个类知道另一个类的属性和方法;如:老师与学生,丈夫与妻子
关联可以是双向的,也可以是单向的。双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。

依赖(Dependency)(传参或返回值)

是一种使用的关系, 即一个类的实现需要另一个类的协助, 所以要尽量不使用双向的互相依赖.

聚合(Aggregation)(关系不怎么紧密)(汽车和轮子)

是整体与部分的关系, 且部分可以离开整体而单独存在. 如车和轮胎是整体和部分的关系, 轮胎离开车仍然可以存在.

组合(Composition)(关系比较紧密,缺一不可)(公司和部门)

是整体与部分的关系, 但部分不能离开整体而单独存在. 如公司和部门是整体和部分的关系, 没有公司就不存在部门.

绘图

绘图工具:PowerDesigner 16

[类的表示,以及正向工程、逆向工程]

图片.png

如图所示这是一个标准的类图,虽然只有一个简单的类。

整体结构分为上中下三个部分,上边是类名Student(学生);
中间有两个成员变量,"-"号表示private,“+”号表示public,变量名分别是name(姓名)和age(年龄),类型分别是String和int;
下边是两个方法,"-"号表示private,“+”号表示public,方法名分别是getName、getAge、setName、setAge,返回值分别是String、int、void、void。

点击Preview标签可以查看代码,如下:

图片.png

像这种将模型转换成代码的过程称之为正向工程。当然,我们也可以直接修改Preview中的代码,从而生成新的模型,这叫做逆向工程(也叫反向工程)

我们发现,以上代码是有问题的,修改后的代码如下:

图片.png

我们发现,getName和getAge的返回值被修改,setName和setAge增加的传参,之后类图的内容会有所变化I(逆向工程),如下:

图片.png

鼠标双击成员变量和成员方法可以修改或查看具体属性,我们先来查看一下setName这个方法的具体属性:

图片.png

主要关注一下常规ParamtersImplemention这三个标签,其中Paramters是方法的参数,Implemention是方法的具体实现

图片.png 图片.png

[接口和类的关系]

图片.png

接口由上图框出来的图标创建,接口和类之间的关系是实现,用来实现关系的线使用这个按钮

图片.png

最终效果图如下:

图片.png

双击类和借口之间的线可以查看属性

图片.png

可以很明白的看出哪个是类,哪个是接口,即虚线上的箭头指向接口。

接下来,查看一下源码有什么变化?点击preview标签查看代码

图片.png

[泛化关系实现]

泛化关系其实就是继承关系,如图所示

图片.png

图中Student有两个子类:ClassAStudent、ClassBStudent

双击父类和子类之间的实线可以查看父类和子类间的关系,双击ClassAStudent类,查看它的源码

图片.png

[关联关系实现]

图片.png

如图所示,新增了Teacher类,Teacher和ClassAStudent是关联关系,Teacher和ClassBStudent也是关联关系,这里涉及到区域范围,图中标注Teacher的取值是[0,1],ClassAStudent和ClassBStudent的取值范围是[0,无穷],所以Teacher和ClassAStudent以及Teacher和ClassBStudent是一对多的关系,从代码中也可以看出:

图片.png

当然,这里的ClassAStudent和ClassBStudent也有可能是一个集合。

如果改成一对一的关系,如图:


图片.png

代码如下:

图片.png

[依赖(Dependency)关系实现]

这里要注意下依赖关系和关联关系的区别,它们之间的区别可以从代码实现的差异中看出来。

图片.png

如上图代码,setCar的参数是Car或者getCar的返回值是Car,我们都可以认为Teacher类和Car类是依赖关系,UML图如下:

图片.png

[聚合(Aggregation)关系实现]

聚合的关系不怎么紧密,比如汽车和轮子,轮子是汽车的一部分,但是它们可以单独存在。

图片.png

箭头的方向应该是指向轮子,可以理解为汽车包含轮子

[组合(Composition)关系实现]

组合的关系比较紧密,缺一不可,比如公司和部门,如果没有公司肯定没有部门。

图片.png

箭头的方向应该是指向部门,可以理解为公司包含部门

[本章完...]

上一篇下一篇

猜你喜欢

热点阅读