UML类图知识入门

UML类图知识入门

UML简介

UML图有很多种,我们不用也没必要掌握所有的UML图,一般说来,只要掌握类图、用例图、时序图的使用,就能完成大部分的工作(经典的28原则,只要掌握20%的UML图,就能完成80%的工作)。类图是我们技术评审中最常见的UML图,本篇也就针对此来做些介绍。

类图有哪些

类是面向对象的概念,类图是面向对象系统建模中最常用和最重要的图,是定义其它图的基础。类图主要是用来显示系统中的类、接口以及它们之间的静态结构和关系的一种模型。类图中最基本的元素是类、接口、包。技术设计文档里面一般会把整个模块或者系统的类图画出来,只要遵循了UML的基本原则那么所有程序猿就都能看懂。

类的表示法

具体类

具体类在类图中用矩形框表示,矩形框分为三层:第一层是类名字;第二层是类的成员变量;第三层是类的方法。

成员变量以及方法前的访问修饰符用符号来表示:

“+”表示 public

“-”表示 private

“#”表示 protected

不带符号表示 default

UML%E7%B1%BB%E5%9B%BE%E7%9F%A5%E8%AF%86%E5%85%A5%E9%97%A8%20b5db8576f9fb46849cc9da9c33959e5d/image1.png

抽象类

抽象类在UML类图中同样用矩形框表示,但是抽象类的类名以及抽象方法的名字都用 斜体字 表示:

UML%E7%B1%BB%E5%9B%BE%E7%9F%A5%E8%AF%86%E5%85%A5%E9%97%A8%20b5db8576f9fb46849cc9da9c33959e5d/image2.png

接口的表示法

接口在类图中也是用矩形框表示,但是与类的表示法不同的是,接口在类图中的第一层顶端用构造型 <>表示,下面是接口的名字,第二层是方法,如下图所示:

UML%E7%B1%BB%E5%9B%BE%E7%9F%A5%E8%AF%86%E5%85%A5%E9%97%A8%20b5db8576f9fb46849cc9da9c33959e5d/image3.png

类图中的关系

类和类、类和接口、接口和接口之间存在一定关系,UML类图中一般会有连线指明它们之间的关系。关系共有六种类型,分别是实现关系、泛化关系、关联关系、依赖关系、聚合关系、组合关系:

UML%E7%B1%BB%E5%9B%BE%E7%9F%A5%E8%AF%86%E5%85%A5%E9%97%A8%20b5db8576f9fb46849cc9da9c33959e5d/image4.png

实现关系

实现关系是指接口及其实现类之间的关系。在UML类图中,实现关系用空心三角和虚线组成的箭头来表示,从实现类指向接口,如下图所示:

UML%E7%B1%BB%E5%9B%BE%E7%9F%A5%E8%AF%86%E5%85%A5%E9%97%A8%20b5db8576f9fb46849cc9da9c33959e5d/image5.png

泛化关系

泛化关系(Generalization)就是对象与对象之间的继承关系。如果对象A和对象B之间的“is a”关系成立,那么二者之间就存在继承关系,对象B是父对象,对象A是子对象(A is a B)。例如,香蕉“is a”水果,很显然香蕉对象和水果对象之间存在继承关系,水果对象是父对象,香蕉对象是子对象。

在UML类图中,泛化关系用空心三角和实线组成的箭头表示,从子类指向父类,如下图所示:

UML%E7%B1%BB%E5%9B%BE%E7%9F%A5%E8%AF%86%E5%85%A5%E9%97%A8%20b5db8576f9fb46849cc9da9c33959e5d/image6.png

在Java代码中,对象之间的泛化关系可以直接翻译为关键字 extends

关联关系

关联关系(Association)是指对象和对象之间的连接,它使一个对象知道另一个对象的属性和方法。关联关系的代码表现形式为一个对象含有另一个对象的引用。也就是说,如果一个对象的类代码中,包含有另一个对象的引用(强引用和弱引用),那么这两个对象之间就是关联关系。

关联关系有单向关联和双向关联(双向关联关系很容易引起循环引用哦)。如果两个对象都知道(即可以调用)对方的公共属性和操作,那么二者就是双向关联。如果只有一个对象知道(即可以调用)另一个对象的公共属性和操作,那么就是单向关联。大多数关联都是单向关联,单向关联关系更容易建立和维护,有助于寻找可重用的类。

在UML图中,双向关联关系用带双箭头的实线或者无箭头的实线双线表示。单向关联用一个带箭头的实线表示,箭头指向被关联的对象,如下图所示:

UML%E7%B1%BB%E5%9B%BE%E7%9F%A5%E8%AF%86%E5%85%A5%E9%97%A8%20b5db8576f9fb46849cc9da9c33959e5d/image7.png

一个对象可以持有其它对象的数组或者集合。在UML中,通过放置多重性(multipicity)表达式在关联线的末端来表示。多重性表达式可以是一个数字、一段范围或者是它们的组合。多重性允许的表达式示例如下:

数字:精确的数量

  • 或者0..*:表示0到多个

0..1:表示0或者1个

1..*:表示1到多个

实际开发中我们可以对关联关系进一步细分:又可分为依赖关联、聚合关联和组合关联三种类型。

依赖关系

依赖(Dependency)关系是一种弱关联关系。如果对象A用到对象B,但是和B的关系不是太明显的时候,就可以把这种关系看作是依赖关系。即 A “use a” B。比如驾驶员和汽车的关系,驾驶员使用汽车,二者之间就是依赖关系。

在UML类图中,依赖关系用一个带虚线的箭头表示,由使用方指向被使用方,表示使用方对象持有被使用方对象的引用,如下图所示:

UML%E7%B1%BB%E5%9B%BE%E7%9F%A5%E8%AF%86%E5%85%A5%E9%97%A8%20b5db8576f9fb46849cc9da9c33959e5d/image8.png

聚合关系

聚合(Aggregation)是关联关系的一种特例,它体现的是整体与部分的拥有关系,即 “has a” 的关系。此时整体与部分之间是可分离的,谁离开了谁都可以活下去,它们具有各自的生命周期,例如,公司部门与员工的关系,一个部门黄了,员工可以转岗到其它部门。

在UML图中,聚合关系用空心菱形加实线箭头表示,空心菱形在整体一方,箭头指向部分一方,如下图所示:

UML%E7%B1%BB%E5%9B%BE%E7%9F%A5%E8%AF%86%E5%85%A5%E9%97%A8%20b5db8576f9fb46849cc9da9c33959e5d/image9.png

组合关系

组合(Composition)也是关联关系的一种特例,它同样体现整体与部分间的包含关系,即 “contains a” 的关系。但此时整体与部分是不可分割的,部分也不能给其它整体共享,作为整体的对象负责部分的对象的生命周期。这种关系比聚合更强,也称为强聚合。如果A组合B,则A需要知道B的生命周期,即A负责生成或者释放B,又或者A通过某种途径知道B的生成和释放。

例如,中国和台湾的关系,台湾是中国的组成部分,是中国不可分割的领土。

在UML图中,组合关系用实心菱形加实线箭头表示,实心菱形在整体一方,箭头指向部分一方,如下图所示:

UML%E7%B1%BB%E5%9B%BE%E7%9F%A5%E8%AF%86%E5%85%A5%E9%97%A8%20b5db8576f9fb46849cc9da9c33959e5d/image10.png