目录

1. 前言

2. 类图概述

3. 类图表示法

3.1 类的表示方式

3.2 类与类之间关系的表示方式

(1)继承(泛化)关系

(2)实现关系

(3)依赖关系

(4)一般关联关系

(5)聚合关系

(6)组合关系


1. 前言

UML全称(Unified Modeling Language),译为统一建模语言,是用来设计软件的可视化建模语言。它的特点是简单,统一,图形化,能表达软件设计中的动态与静态信息。

UML从目标系统的不同角度出发,定义了用例图,类图,对象图,状态图,活动图,时序图,协作图,构件图,部署图九种图,本篇文章重点描述类图。


2. 类图概述

类图(Class Diagram)是显示了模型的静态结构,特别是模型中静态的类,类的内部结构以及它们与其他类的关系等。类图不显示暂时性的信息。类图是面向对象建模的主要组成部分。


3. 类图表示法

3.1 类的表示方式

在UML类图中,类使用包含类名,属性(field),方法(method),且带有分割线的矩形来表示。

如下图 Employee 员工类,它包含有name,age,address三个属性以及 work() 方法。属性/方法名称前面加的 "+" 和 "-" 表示了这个属性或方法的可见性。

一般情况下类的属性都是私有的,类的方法都是公开的;

"+" 表示 public 公开的,所有人都可以访问;

"-"  表示 private 私有的,只有本类中可以访问;

"#" 表示protected 受保护的,只有本包中的类或子类才可以访问;

什么都不加通常表示为默认,但一般很少使用;

属性的完整表示方式:可见性 名称:类型 [= 缺省值]

方法的完整表示方式:可见性 名称(参数列表) [: 返回值类型]

小练习:了解了表示方式,我们再来看下面这个类图,就非常好理解啦。

表示的含义就是类名为 Demo,没有属性值,有三个方法分别为 method,method1,method2;

method 方法访问修饰符为public,方法名为method,没有参数,方法没有返回值;

method1 方法访问修饰符为 private,方法名为 method1,没有参数,返回值类型为String;

method2 方法访问修饰符为 protected,方法名为 method2,有两个参数par1,par2,参数值类型分别为Int,String,方法返回值类型为Int。


3.2 类与类之间关系的表示方式

类与类之间的关联关系通常所熟知的是6种,如下图所示,但这6种之中,一般关联关系,聚合关系,组合关系都是属于关联关系这个大类中的,只是我们通常会将它们三者分开来说,这里展示此图也是为了小伙伴们能够清楚的知道类与类之间关联关系的分类。

下面我们就对这六种关系分别做出举例解释。

(1)继承(泛化)关系

继承关系使用实线空心三角表示,空心三角指向父类,一个父类可以被多个子类继承; 

继承关系(也叫泛化关系)大家都不陌生,在Java中子类extends继承父类,就拥有了父类中所有非私有化的属性和方法。

继承关系是对象之间耦合度最大的一种关系,在项目中,我们通常会将所有类公共的部分抽取出来作为一个Base基类,然后所有类去继承这个基类。

如下图,Person 人类为父类,Student学生类和Teacher教师类都继承Person人类;

(2)实现关系

实现关系使用虚线空心三角表示,空心三角指向被实现的接口,一个接口可以被多个类同时实现重写出不同的逻辑; 

实现关系就是接口和实现类之间的关系,Class 类 implements 实现接口 Interface,类就需要去重写接口中的所有抽象操作。

举个栗子:

如下 Vehicle 交通工具为接口,接口中定义了一个方法 move(),但并没有具体的实现,Car汽车类和Ship船类都可以实现 Vehicle 接口,并重写move()方法;

(3)依赖关系

依赖关系使用虚线箭头表示,箭头指向被依赖的类,一个类也可以被多个类依赖;

依赖关系是一种使用关系,它是对象之间耦合度最低的一种关联方式,是临时性的关联。一个类依赖另一个类,就使用带箭头的虚线表示,箭头指向被依赖类。

最直观的体现就是在代码中,某个类的方法通过局部变量,方法的参数或者对静态方法的调用来访问另一个类(被依赖类)中的某些方法来完成一些职责。

举个例子:

如下图所示,有Driver司机类和Car汽车类,Driver类中有一个driver方法,参数需要传递Car类对象,Car类中有一个move方法。

司机类依赖汽车类,司机需要有汽车,才能进行移动;

(4)一般关联关系

一般关联关系有单向关联,双向关联,自关联三种情况

单向关联举例

Addres 是地址类,Customer 是顾客类,每一个顾客都会有一个地址,Customer 类中是可以定义Address对象作为自己的属性,这就属于单向关联。

UML图中单向关联使用实线实心三角箭头表示。

 双向关联举例

Customer顾客类,Product商品类。一个顾客可以拥有多个商品,一个商品也归属于一位顾客,像这样双方各自含有对方类型的成员变量,就属于双向关联。双向关联使用一条实线将双方连接起来就可以了

自关联举例

自关联在UML图中是使用一个箭头指向自己就可以了,自关联这种情况比较少见,但是却通常应用在树中。

一个树Tree可以有多个分支,一个分支上有很多叶子,这种情况通常会使用Node节点来展示,在Node节点中在定义自己Node,说白了就是Node里面嵌套Node,如果嵌套两层不够,可以继续嵌套Node,类似套娃。

(5)聚合关系

聚合关系是关联关系的一种,是强关联关系,是整体与部分之间的关系。

聚合关系是通过成员变量来实现的,其中成员对象是整体对象的一部分,但是成员对象却可以脱离整体而独立存在。

UML图中聚合关系使用实线空心菱形来表示,空心菱形指向整体类,实线另一端指向个体类,一个整体类可以由多个个体类聚合而成;

举个栗子:

学校的老师,学校的保安,学校里会存在老师,保安,学生,食堂阿姨等等一系列不同的人,这些人共同组成这个学校,如果有一天学校不在了,这些人仍然会存在,老师可以去另一家学校教书,保安也可以去另一家学校当保安。

放在代码中就是,一个类中的属性是由其他多个类对象构成的,如图,Teacher 教师类的类对象就可以作为 University 大学类中的一个属性存在,这就是聚合。

(6)组合关系

组合关系是一种比聚合关系更为强烈的关系,在组合关系中,整体对象可以控制部分对象的生命周期,一旦整体不存在,个体也将不复存在;

而上面我们说到的聚合关系中,个体可以脱离整体而独立存在,但是在组合关系中,个体不能脱离整体而存在,这就是它们二者最大的区别;

UML图中组合关系使用实线实心菱形表示,实心菱形指向整体类,实现另一端指向个体类,一个整体类可以由多个个体类组合而成;

举个栗子:

 Head 头类,头可以由眼睛,耳朵,鼻子,嘴巴等构成,但如果头不存在,那么组成头的眼睛,耳朵,嘴巴,鼻子也就不复存在了。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐