UML类图

六种UML类关系图

Posted by YuCong on September 20, 2020

UML,全称Unified Modeling Language,统一建模语言。UML图分为用例图、类图、对象图、状态图、活动图、时序图、协作图、构件图、部署图等9种图。在面向对象语言中,我们经常看到有用UML类图去表示各种接口和类之间关系的。本文主要记录UML类图中常用的六中类关系。


Created 2020.09.20 by William Yu; Last modified: 2022.08.19-V1.2.4

Contact: windmillyucong@163.com

Copyleft! 2022 William Yu. Some rights reserved.


UML类图

References

1. 类图

1. 具体类的表示

  • UML 使用矩形框表示具体类

  • 矩形框分为三层
    • 第一层是类的名字
    • 第二层是类的成员变量
    • 第三层是类的方法
  • 成员变量以及方法的访问修饰符:
    • public, +
    • private, -
    • protected, # (friendly也归入这类)
    • default,~ 或者不带符号
    • static, _ 下面添加下划线表示 比如这样:static int a;
    • Derived, /
  • 属性的完整表示:

    可见性 名称 :类型 [ = 缺省值]

    中括号中的内容表示是可选的

  • 方法的完整表示:

    可见性 名称(参数列表) [ : 返回类型]

    同样,中括号中的内容是可选的

2. 抽象类的表示

  • 抽象类名以及抽象方法用斜体字表示

3. 接口的表示

  • 接口在类图的顶端用构造型 <<interface>> 表示
  • 此外,接口也可以使用 棒棒糖表示法
    • 类上面的一根棒棒糖(圆圈+实线)
    • 圆圈旁边为接口名称
    • 接口方法在实现类中出现

2. 类间关系表达

UML类图的六种关系:

  • 依赖关系
  • 关联关系
  • 聚合关系
  • 组合关系
  • 实现关系
  • 泛化关系

30分钟学会UML类图

2.1 实现关系(realize)

  • 实现关系就是接口和实现类之间的关系。 implements
  • 类实现了接口中的抽象方法。
  • 在最终的代码中,表现为继承抽象类
  • 在UML类图中,用带空心三角箭头的虚线来表示实现关系,箭头从实现类指向接口。
  • e.g. 大学是个接口,北京大学和清华大学分别实现了大学接口。

file

2.2 泛化关系(Generalization)

  • 泛化关系其实就是父子类之间的继承关系,表示一般与特殊的关系,指定子类如何特殊化父类的特征和行为。
  • “is a” 关系
  • A 是父类,B是子类,可以认为 B is a A。
  • 最终代码中,泛化关系表现为继承非抽象类
  • 在UML类图中,用带空心三角箭头的实线来表示泛化关系,箭头从子类指向父类。
  • 如上图,父类动物有一个吃的方法,小鸟和狮子都继承于动物类,小鸟有它特有的方法飞行,而狮子有特有的方法奔跑。

file

2.3 关联关系(Association)

  • 关联关系又分为
    • 依赖关联、聚合关联和组合关联三种类型。
  • “引用”
  • 表示一个类和另外一个类之间的联系,如老师和学生,丈夫和妻子等
  • 关联关系的代码表现形式为一个对象含有另一个对象的引用
  • 关联关系有单向和双向的
  • 最终代码中,表现为成员变量
  • 在UML类图中
    • 单向关联用一个带箭头的实线表示,箭头从使用类指向被关联的类
    • 双向关联用带箭头或者没有箭头的实线来表示
  • e.g.
    • 老师和学生之间的关系是双向的,一个老师可以有多个学生,一个学生也可以有多个老师
    • 学生和课程之间是单向的,一个学生会学习多门课程,而课程是一个抽象的概念,它不拥有学生

file

补充:多重性表达式
  • 一个对象可以持有其他对象的数组或者集合,在UML中,可以放置多重性(multiplicity)表达式在关联线的末端来表示。
  • 多重性表达式可以是一个数字,一段范围或者他们的组合。
  • 多重性表达式格式:
    • 数字:精确的数量
    • *或者 0.. * : 表示0到多个
    • 0..1:表示0个或者1个
    • 1..*:表示1到多个

2.4 依赖关系(Dependency)

  • 是一种弱关联关系

  • “使用” “use a”

  • 表示某个类依赖于另外一个类

  • 通常表现为,某个类的方法的参数使用了另外一个类的对象

  • A 使用 B,A 为使用类,B为被依赖的类,对象A依赖于对象B

  • 最终代码中,依赖关系体现为类构造方法及类方法的传入参数,箭头的指向为调用关系;依赖关系除了临时知道对方外,还是“使用”对方的方法和属性

  • 在UML类图中,依赖关系用带箭头的虚线表示

  • 箭头从使用类A指向被依赖的类B

  • e.g. 下图中表示,程序员依赖于计算机来编写代码。

    file

  • e.g.

    ![img](https://upload-images.jianshu.io/upload_images/5336514-823083d2d77916ae.png?imageMogr2/auto-orient/strip imageView2/2/w/414/format/webp)

2.5 聚合关系(Aggregation)

  • 是关联关系的一种特例
  • 它体现的是整体与部分的拥有关系
  • 即 “has a” 的关系
  • 聚合关系在类中是通过成员对象来体现的
  • 成员是整体的一部分,成员也可以脱离整体而存在。如老师是学校的一部分,同时老师也是独立的个体,可以单独存在。
  • 在UML类图中,用带空心菱形的实线来表示聚合关系,菱形指向整体。

file

  • e.g.

    ![img](https://upload-images.jianshu.io/upload_images/5336514-e63191f4e23f2ad9.png?imageMogr2/auto-orient/strip imageView2/2/w/297/format/webp)

2.6 组合关系(Composition)

  • 也是关联关系的一种特例
  • 组合关系是整体和部分之间的关系,但是一种比聚合关系还要强的关系
  • 即 “contains a” 的关系
  • 聚合关系的组成部分是可以脱离整体独立存在的,组合关系的部分无法独立存在
  • 此时整体与部分是不可分的,部分也不能给其它整体共享,作为整体的对象负责部分的对象的生命周期。
  • 部分对象不能脱离整体对象而单独存在,如人的身体和大脑之间的关系,大脑不能脱离身体而单独存在。
  • 在UML类图中,用带实心菱形的实线来表示组合关系,菱形指向整体。

file

聚合关系与组合关系的差别

从代码上看:

  • 聚合关系的A类里含有另一个B类作为参数,需要在构造A类之前构造B类
  • 组合关系的类里含有另一个类的实例化,会在构造A类的内部构造B类
1
2
3
4
5
6
7
8
9
10
11
12
public  class GooseGroup  {  
    public Goose goose;  
    public GooseGroup(Goose goose)  {  
        this.goose = goose;  
	}
}
class Goose  {  
    public Wings wings;
    public Goose()  {
        wings=new Wings();  
    }  
}  
  • 聚合关系中,客户端可以同时了解两个类
  • 组合关系中,客户端只能了解A类,B类被严密封装在A类中

总结

  • 六种关系中,从弱到强依次是: 依赖关系 < 关联关系 < 聚合关系 < 组合关系 < 实现关系 = 泛化关系

其他:

  • 制图工具: staruml专门画UML的
  • 或者plantuml 非常好用 https://plantuml.com/activity-diagram-beta

Contact

Feel free to contact me windmillyucong@163.com anytime for anything.

License

Creative Commons BY-SA 4.0

CC0