UML建模<第三篇>:类图
类图(Class Diagram)是面向对象系统建模中最常用和最重要的图。主要是用来显示系统中的类、接口以及它们之间的静态结构和关系的一种静态模型。是唯一可以直接映射到面向对象的语言。
本文使用PowerDesigner 16绘制类图。
目的
[一]
分析和设计应用程序的静态视图。
[二]
描述一个系统的责任。
[三]
基地组件图和部署图。
[四]
正向和逆向工程。
正向工程
是通过从特定实现语言的映射而把模型转换为代码
的过程。
逆向工程
是通过从特定实现语言的映射而把代码转换为模型
的过程。
主要元素
类(class)、接口(interface)、端口(port)、关联关系(Association)、依赖(Dependency)、聚合(Aggregation)、组合(Composition)
端口(Port):类元与外部部件交互的连接处。用类元边框线上的小矩形框标识类元一般都是以封闭的结构体,在组合结构图中通过端口与外部交互。
主要关系
泛化(Generalization)
是一种继承关系, 表示一般与特殊的关系, 它指定了子类如何特化父类的所有特征和行为. 例如:老虎是动物的一种, 即有老虎的特性也有动物的共性.
实现(Realization)
是一种类与接口的关系, 表示类是接口所有特征和行为的实现.
关联(Association)
(引用)
是一种拥有的关系, 它使一个类知道另一个类的属性和方法;如:老师与学生,丈夫与妻子
关联可以是双向的,也可以是单向的。双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。
依赖(Dependency)
(传参或返回值)
是一种使用的关系, 即一个类的实现需要另一个类的协助, 所以要尽量不使用双向的互相依赖.
聚合(Aggregation)
(关系不怎么紧密)(汽车和轮子)
是整体与部分的关系, 且部分可以离开整体而单独存在. 如车和轮胎是整体和部分的关系, 轮胎离开车仍然可以存在.
组合(Composition)
(关系比较紧密,缺一不可)(公司和部门)
是整体与部分的关系, 但部分不能离开整体而单独存在. 如公司和部门是整体和部分的关系, 没有公司就不存在部门.
绘图
绘图工具:PowerDesigner 16
[类的表示,以及正向工程、逆向工程]
如图所示这是一个标准的类图,虽然只有一个简单的类。
整体结构分为上中下三个部分,上边是类名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主要关注一下常规
、Paramters
、Implemention
这三个标签,其中Paramters
是方法的参数,Implemention
是方法的具体实现
[接口和类的关系]
接口由上图框出来的图标创建,接口和类之间的关系是实现
,用来实现关系的线使用这个按钮
最终效果图如下:
图片.png双击类和借口之间的线可以查看属性
图片.png可以很明白的看出哪个是类,哪个是接口,即虚线上的箭头指向接口。
接下来,查看一下源码有什么变化?点击preview标签查看代码
图片.png[泛化关系实现]
泛化关系
其实就是继承关系,如图所示
图中Student有两个子类:ClassAStudent、ClassBStudent
双击父类和子类之间的实线可以查看父类和子类间的关系,双击ClassAStudent类,查看它的源码
图片.png[关联关系实现]
如图所示,新增了Teacher类,Teacher和ClassAStudent是关联关系,Teacher和ClassBStudent也是关联关系,这里涉及到区域范围,图中标注Teacher的取值是[0,1],ClassAStudent和ClassBStudent的取值范围是[0,无穷],所以Teacher和ClassAStudent以及Teacher和ClassBStudent是一对多
的关系,从代码中也可以看出:
当然,这里的ClassAStudent和ClassBStudent也有可能是一个集合。
如果改成一对一的关系,如图:
图片.png
代码如下:
图片.png[依赖(Dependency)关系实现]
这里要注意下依赖关系和关联关系的区别,它们之间的区别可以从代码实现的差异中看出来。
图片.png如上图代码,setCar的参数是Car或者getCar的返回值是Car,我们都可以认为Teacher类和Car类是依赖关系,UML图如下:
图片.png[聚合(Aggregation)关系实现]
聚合的关系不怎么紧密,比如汽车和轮子,轮子是汽车的一部分,但是它们可以单独存在。
图片.png箭头的方向应该是指向轮子,可以理解为汽车包含轮子
。
[组合(Composition)关系实现]
组合的关系比较紧密,缺一不可,比如公司和部门,如果没有公司肯定没有部门。
图片.png箭头的方向应该是指向部门,可以理解为公司包含部门
。
[本章完...]