「图_01」类图
系列文章:
「图_02」时序图:https://blog.youkuaiyun.com/qq_36098284/article/details/106027120
「图_03」用例图:https://blog.youkuaiyun.com/qq_36098284/article/details/106028360
1.介绍
简单来说,类图主要是用来表示类以及类直接的关系。
2.画法
类图中,主要是包括图和关系。
2.1 类 & 接口
图其实也就是我们看到的长方形,主要用来表示各个类和接口。
类(Class):使用三层矩形框表示。
第一层显示类的名称,如果是抽象类,则就用斜体显示。
第二层是字段和属性。
第三层是类的方法。
注意前面的符号,‘+’表示public,‘-’表示private,‘#’表示protected。
上面是普通类的画法,如果是抽象类的话,需要在第一层,指明<<abstract>>
接口:使用两层矩形框表示,与类图的区别主要是顶端有<<interface>>标识。
第一行是接口名称。
第二行是接口方法。
2.2 关系
一定要注意这些关系的英文名称,因为在作图到时候,这些关系都是用英文表示的。
首先,继承的关系主要分类继承抽象类还是非抽象类,那么对应的关系就是实现和泛化
2.2.1 泛化 (Generalization)
最简单的表述就是两个类之间的继承关系是is-a,表示为...是...,比如汽车是车,猫是动物。在代码体现中为继承非抽象类。
该关系使用带有空心箭头的直线表示。比如,SUV和汽车就是这种关系
2.2.2 实现 (realize)
比如车是一个抽象的概念,在现实中无法直接用来定义对象,只有指明具体的子类(自信车/汽车)后,才可以用来定义对象,
该关系使用一条带空箭头的虚线表示。在代码中通常表示为继承抽象类。
接下来介绍的聚合和组合关系也经常被弄混,主要的区别就是是否是强依赖的关系。
2.2.3 聚合(aggregation)
聚合关系用一条带空心菱形箭头的直线表示,如下图表示A聚合到B上,或者说B由A组成;
聚合关系用于表示实体对象之间的关系,表示整体由部分构成的语义;例如一个部门由多个员工组成;
与组合关系不同的是,整体和部分不是强依赖的,即使整体不存在了,部分仍然存在;
例如, 部门撤销了,人员不会消失,他们依然存在;
2.2.4 组合(composition)
组合关系用一条带实心菱形箭头直线表示,如下图表示A组成B,或者B由A组成;
与聚合关系一样,组合关系同样表示整体由部分构成的语义;比如公司由多个部门组成;
但组合关系是一种强依赖的特殊聚合关系,如果整体不存在了,则部分也不存在了;
例如, 公司不存在了,部门也将不存在了;
对于组合和聚合,还有一点要说明的是,除了关系要画好线和指向之外,还需要在关系上注明具体关系的名称和数量。
拿下面的一个实例来举例子,教师和课程之间是组合关系,这里没有画出实心菱形的表示,请在自己画图的时候加上。教师和课程的关系是讲授这是显而易见的。而教师的“1”和课程的“*”表示,一个教师可以讲多个课程,“*“表示无数个的意思,如果题目要严格的要求,比如一个老师只能讲授不超过3们课,那么”*”变成“0..3“,表示0到3门是一个范围。
下面要注意依赖和关联的区别,前者是动态的,运行时存在的关系,但是后者是静态的,和是否运行无关。
2.2.5 关联(association)
关联关系是用一条直线表示的;它描述不同类的对象之间的结构关系;
它是一种静态关系, 通常与运行状态无关,一般由常识等因素决定的;它一般用来定义对象之间静态的、天然的结构; 所以,关联关系是一种“强关联”的关系;
比如,乘车人和车票之间就是一种关联关系;学生和学校就是一种关联关系;
关联关系默认不强调方向,表示对象间相互知道;如果特别强调方向,如下图,表示A知道B,但 B不知道A;
2.2.6 依赖关系(dependency)
依赖关系是用一条带箭头的虚线表示的;如下图表示A依赖于B;他描述一个对象在运行期间会用到另一个对象的关系;
与关联关系不同的是,它是一种临时性的关系,通常在运行期间产生,并且随着运行时的变化; 依赖关系也可能发生变化;
显然,依赖也有方向,双向依赖是一种非常糟糕的结构,我们总是应该保持单向依赖,杜绝双向依赖的产生;
注:在最终代码中,依赖关系体现为类构造方法及类方法的传入参数,箭头的指向为调用关系;依赖关系除了临时知道对方外,还是“使用”对方的方法和属性;
3. 实例
下面来看一个具体的实例:
注意这里没有注明聚合和组合关系中的关系名称和数字,可以自己注明。
- 车的类图结构为<<abstract>>,表示车是一个抽象类;
- 它有两个继承类:小汽车和自行车;它们之间的关系为实现关系,因为车是抽象类,使用带空心箭头的虚线表示;
- 小汽车为与SUV之间也是继承关系,它们之间的关系为泛化关系,因为小汽车是非抽象类,使用带空心箭头的实线表示;
- 小汽车与发动机之间是组合关系,使用带实心箭头的实线表示;
- 学生与班级之间是聚合关系,使用带空心箭头的实线表示;
- 学生与身份证之间为关联关系,使用一根实线表示;
- 学生上学需要用到自行车,与自行车是一种依赖关系,使用带箭头的虚线表示;
参考:https://www.cnblogs.com/duanxz/archive/2012/06/28/2568858.html
https://design-patterns.readthedocs.io/zh_CN/latest/read_uml.html