美文网首页
UML建模<第三篇>:类图

UML建模<第三篇>:类图

作者: NoBugException | 来源:发表于2020-05-02 17:58 被阅读0次
    图片.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

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

    [本章完...]

    相关文章

      网友评论

          本文标题:UML建模<第三篇>:类图

          本文链接:https://www.haomeiwen.com/subject/qyycghtx.html