简介

  • UML(Unified modeling language UML)统一建模语言,是一种用于软件系统分析和设计的语言工具,它用于帮助软件开发人员进行思考和记录思路的结果。
  • UML本身是一套符号的规定,就像数学符号和化学符号一样,这些符号用于描述软件模型中的各个元素和他们之间的关系,比如类、接口、实现、泛化、依赖、组合、聚合等。

UML类图

  • 用户描述系统中的类(对象)本身的组成和类(对象)之间的各种静态关系
  • 类图是系统分析和设计阶段的重要产物,是系统编码和测试的重要模型。
  • 类之间的关系:实现、泛化(继承)、依赖、关联、聚合和组合

类图表示法

UML类图中具体类、抽象类、接口和包有不同的表示方法。

在UML类图中表示具体类

具体类在类图中用矩形框表示,矩形框分为三层:第一层是类名字。第二层是类的成员变量;第三层是类的方法。成员变量以及方法前的访问修饰符用符号来表示:

  • “+” 表示 public
  • “-” 表示 private
  • “#” 表示 protected
  • 不带符号表示 default

image-20190810164357710

UML类图中表示抽象类

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

image-20190810164429694

在UML类图中表示接口

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

image-20190810174331008

此外,接口还有另一种表示法,俗称棒棒糖表示法,就是类上面的一根棒棒糖(圆圈+实线)。圆圈旁为接口名称,接口方法在实现类中出现。

在类图中表示关系

类和类、类和接口、接口和接口之间存在一定关系,UML类图中一般会有连线指明它们之间的关系。

关系共有六种类型 ,如下图:

image-20190810164644239

实现关系

  • 实现关系(Implementation)
  • 实现关系是接口与实现类之间的关系。在这种关系中,类实现了接口,类中的操作实现了接口中所声明的所有的抽象操作。
  • 在 UML 类图中,实现关系使用带空心三角箭头的虚线来表示,箭头从实现类指向接口
  • 例如,汽车和船实现了交通工具,其类图:

image-20190810165058761

泛化(继承)关系

  • 泛化(继承)关系(generalization)

  • 泛化关系是对象之间耦合度最大的一种关系,表示一般与特殊的关系,是父类与子类之间的关系,是一种继承关系。

  • 在 UML 类图中,泛化关系用带空心三角箭头的实线来表示,箭头从子类指向父类。在代码实现时,使用面向对象的继承机制来实现泛化关系。

  • 例如,Student 类和 Teacher 类都是 Person 类的子类,其类图如下图所示:

    image-20190810165058761

关联关系

  • 关联关系(Association)
  • 关联关系实际上就是类与类之间的联系。
  • 关联关系是对象之间的一种引用关系,用于表示一类对象与另一类对象之间的联系,如老师和学生、师傅和徒弟、丈夫和妻子等。关联关系是类与类之间最常用的一种关系,分为一般关联关系、聚合关系和组合关系。
  • 关联具有导航性:即双向关系或单向关系
  • 关系具有多重性:如 一对一,一对多

1) 单向关联

image-20190810165058761

在UML类图中单向关联用一个带箭头的实线表示。上图表示每个顾客都有一个地址,这通过让Customer类持有一个类型为Address的成员变量类实现。

2) 双向关联

image-20190810174530610

从上图中我们很容易看出,所谓的双向关联就是双方各自持有对方类型的成员变量。

在UML类图中,双向关联用一个不带箭头的直线表示。上图中在Customer类中维护一个List<Product>,表示一个顾客可以购买多个商品;在Product类中维护一个Customer类型的成员变量表示这个产品被哪个顾客所购买。

3) 自关联

image-20190810174544464

自关联在UML类图中用一个带有箭头且指向自身的线表示。上图的意思就是Node类包含类型为Node的成员变量,也就是“自己包含自己”。

聚合关系

  • 聚合关系(Aggregation)
  • 聚合关联表示的是整体和部分的关系整体与部分可以分开。聚合关联是关联关系的特例。所以,它具有关联的导航性多重性
  • 聚合关系是关联关系的一种,表示一种弱的‘拥有’关系,体现的是A对象可以包含B对象,但是B对象不是A对象的一部分

在代码中: 比如A 类对象包含 B 类对象,B 类对象的生命周期可以不依赖 A 类对象的生命周期,也就是说可以单独销毁 A 类对象而不影响 B 对象

1
2
3
4
5
6
7
8
public class A{

private B b;

public A(B b){
this.b = b;
}
}

在 UML 类图中,聚合关系可以用带空心菱形的实线来表示,菱形指向整体。

下图所示是大学和教师的关系图:

image-20190810174606350

组合关系

  • 组合关系(Composition)
  • 组合关系,也是整体与部分的关系,但是整体与部分不可以分开。
  • 组合关系是一种强‘拥有’关系,体现了严格的部分和整体的关系,部分和整体的声明周期一样

在代码中: 比如A 类对象包含 B 类对象,B 类对象的生命周期依赖A 类对象的生命周期,B 类对象不可以单独存在

1
2
3
4
5
6
7
8
9
public class A{

private B b;

public A(){
this.b = new B();
}

}

在 UML 类图中,组合关系用带实心菱形的实线来表示,菱形指向整体。

下图所示是头和嘴的关系图:

image-20190810174615284

依赖关系

  • 依赖关系(Dependence)

  • 只要是在类中用到了对方,那么他们之间就存在依赖关系。依赖关系是一种使用关系,它是对象之间耦合度最弱的一种关联方式,是临时性的关联。

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

  • 如果没有对方,连编译都通不过去。

  • 类中用到了对方:类的成员属性方法接收参数类型方法的返回类型方法中使用到类型

  • 在 UML 类图中,依赖关系使用带箭头的虚线来表示,箭头从使用类指向被依赖的类

    下图所示是司机和汽车的关系图,司机驾驶汽车:

image-20190810174636425