UML图详解

设计师设计出房子。施工人员使用这个设计来建造房子。建筑越复杂,设计师和施工人员之间的交流就越重要。蓝图就成为了这个行业中的设计师和施工人员的必修课。

写软件就好像建造建筑物一样。系统越复杂,参与编写与配置软件的人员之间的交流也就越重要。在过去十年里UML就成为分析师,设计师和程序员之间的“建筑蓝图”。现在它已经成为了软件行业的一部分了。UML提供了分析师,设计师和程序员之间在软件设计时的通用语言。

UML概述

UML被应用到面向对象的问题的解决上。想要学习UML必须熟悉面向对象解决问题的根本原则――都是从模型的建造开始的。一个模型model就是根本问题的抽象。域domain就是问题所处的真实世界。

模型是由对象objects组成的,它们之间通过相互发送消息messages来相互作用的。记住把一个对象想象成“活着的”。对象有他们知道的事(属性attributes)和他们可以做的事(行为或操作behaviors or operations)。对象的属性的值决定了它的状态state。

UML图有很多种,但是并非必须掌握所有的UML图,才能完整系统分析和设计工作。一般说来,在UML图中,只要掌握类图、用例图、时序图的使用,就能完成大部分的工作。

用例图

用例图Use case diagrams描述了作为一个外部的观察者的视角对系统的印象。强调这个系统是什么而不是这个系统怎么工作。

  • 用例Use case是为了完成一个工作或者达到一个目的的一系列情节的总和。
  • 角色actor是发动与这个工作有关的事件的人或者事情。
  • 一个用例图是角色,用例,和它们之间的联系的集合。

20220703144112

用例图在三个领域很有作用

  • 决定特征(需求)。当系统已经分析好并且设计成型时,新的用例产生新的需求
  • 客户通讯。使用用例图很容易表示开发者与客户之间的联系。
  • 产生测试用例。一个用例的情节可能产生这些情节的一批测试用例。

类图

类图Class diagram通过显示出系统的类以及这些类之间的关系来表示系统。类图是静态的-它们显示出什么可以产生影响但不会告诉你什么时候产生影响。

类Classes是对象的“蓝图”。一个类在一个单独的实体中封装了属性(数据)和行为(方法或函数)。对象是类的实例instances。

UML类的符号是一个被划分成三块的方框:类名,属性,和操作。抽象类的名字是斜体的。类之间的关系是连接线。

关系

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

20220703145059

关系 代码体现 箭头指向 描述 举个栗子
泛化关系 继承 带三角箭头的实线,箭头指向父类 是一种继承关系,表示一般与特殊的关系,它指定了子类如何特化父类的所有特征和行为。 老虎是动物的一种,即有老虎的特性也有动物的共性。
实现关系 继承 带三角箭头的虚线,箭头指向接口 是一种类与接口的关系,表示类是接口所有特征和行为的实现 笔刷实现了刷子
关联关系 成员变量 带普通箭头的实心线,指向被拥有者.双向的关联可以有两个箭头或者没有箭头 是一种拥有的关系,它使一个类知道另一个类的属性和方法 老师与学生,丈夫与妻子关联可以是双向的,也可以是单向的
聚合关系 成员变量 带空心菱形的实心线,菱形指向整体 是整体与部分的关系,且部分可以离开整体而单独存在 车和轮胎是整体和部分的关系,轮胎离开车仍然可以存在
组合关系 成员变量 带实心菱形的实线,菱形指向整体 是整体与部分的关系,但部分不能离开整体而单独存在 公司和部门是整体和部分的关系,没有公司就不存在部门
依赖关系 局部变量、方法的参数或者对静态方法的调用 带箭头的虚线,指向被使用者 是一种使用的关系,即一个类的实现需要另一个类的协助,所以要尽量不使用双向的互相依赖 现代人依赖计算机

20220703150400

各种关系的强弱顺序:泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖

  • 聚合关系是关联关系的一种,是强的关联关系;关联和聚合在语法上无法区分,必须考察具体的逻辑关系。
  • 组合关系是关联关系的一种,是比聚合关系还要强的关系,它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期。

时序图

类图和是静态模型的视图。时序图是动态的。他们描述了对象间的交互作用。

时序图将交互关系表示为一个二维图。纵向是时间轴,时间沿竖线向下延伸。横向轴代表了在协作中各独立对象的类元角色。类元角色用生命线表示。当对象存在时,角色用一条虚线表示,当对象的过程处于激活状态时,生命线是一个双道线。

消息用从一个对象的生命线到另一个对象生命线的箭头表示。箭头以时间顺序在图中从上到下排列。

20220703151240

画图工具

可使用mermain在markdown中画图,具体参考mermain使用指南