来源于以下三篇博客
https://blog.csdn.net/doniexun/article/details/38317537
http://www.uml.org.cn/oobject/201104212.asp
https://blog.csdn.net/w_ayf0726/article/details/80151431
时序图定义 : 描述了对象之间 传递消息的时间顺序 传 递 消 息 的 时 间 顺 序 , 用来表示用例中的 行为顺序 行 为 顺 序 , 是强调 消息时间顺序 消 息 时 间 顺 序 的交互图;
时序图描述的事物 : 时序图描述系统中 类和类之间的交互, 类 和 类 之 间 的 交 互 , 将这些交互建模成 消息交换 消 息 交 换 , 时序图描述了类以及类之间的交换以完成的期望行为的消息, 时序图中每条消息都代表了类的一个操作 或者 引起状态机改变的触发事件;
时序图表示 : 参与交互的对象在时序图顶端水平排列, 每个对象的底端绘制了一条垂直虚线, 对象A像对象B发送消息, 用一条带箭头的实线表示, 该实线起始于对象A底部的虚线, 终止于对象B底部的虚线; 实线箭头水平放置, 越靠近顶端越早被发送.
时序图轨迹 : 时序图提供了随时间推移的, 清晰的 可视化的轨迹;
时序图组成 : 时序图包括四个元素 对象(Object), 生命线(Lifeline), 激活(Activation), 消息(Message);
对象的符号 : 时序图中的对象与对象图中的表示方法一样, 使用矩形将对象名称包含起来, 并且对象名称下有下划线;
对象创建时机 : 对象可以在交互开始的时候创建, 也可以在交互过程中进行创建;
−−处于顶部: − − 处 于 顶 部 : 如果对象的位置在时序图顶部, 说明在交互开始的时候对象就已经存在了;
−−不在顶部: − − 不 在 顶 部 : 如果对象的位置不在顶部, 那么对象在交互过程中创建的;
生命线 : 生命线是一条垂直的虚线, 这条虚线表示对象的存在, 在时序图中, 每个对象的底部都有生命线;
生命线作用 : 生命线是一个时间线, 从时序图顶部一直到底部都存在, 其长度取决于交互的时间;
对象的生命线 : 对象与生命线结合在一起就是对象的生命线, 这个概念包含对象图标 以及 对象下面的生命线图标 如上图;
激活(Activation) : 代表时序图中对象执行一项操作的时期, 激活期可以理解为语义中 {} 中的内容, 表示该对象被占用以完成某个任务;
去激活(Deactivation) : 指对象处于空闲状态, 在等待消息激活这个对象;
激活的表示 : 当对象处于激活时期, 生命线可以拓宽为矩形, 这个矩形条成为激活条;
激活去激活的时机 :
−−激活: − − 激 活 : 对象激活是在激活条的顶部激活;
−−去激活: − − 去 激 活 : 激活条的底部去激活, 通常发生在一个消息离开对象生命线;
消息概念 : 定义 交互 和 协作 中 交换信息 的类, 对 对象之间的 通信内容 建模;
消息动作 :
−−动作种类: − − 动 作 种 类 : 消息允许在实体间传递信息 (传递参数), 允许实体请求其它服务, 对象之间通过 发送 和 接收 消息 进行通信;
−−产生结果: − − 产 生 结 果 : 消息可以触发操作, 唤起信号, 或使目标对象创建 或 销毁;
消息的异步和同步通信 :
−−异步通信: − − 异 步 通 信 : 消息是信号的时候, 发送信号之后, 等待对方触发相应方法, 这是明确的 命名的 对象间的异步通信;
−−同步通信: − − 同 步 通 信 : 直接调用对象的方法, 执行方法返回结果, 这种具有返回控制机制的操作是同步通信;
时序图和协作图中消息的区别 : 时序图中的消息强调顺序, 协作图中的消息强调交换消息的对象间的关系;
消息类型 :
示例简介 :
−−使用场景: − − 使 用 场 景 : 汽车租赁公司;
−−使用的对象: − − 使 用 的 对 象 : Customer (客户), Worker (工作人员), Order (请求), Record (记录), Car (汽车);
−−工作流程: − − 工 作 流 程 : ① 客户 向 工人 提出租车要求, ② 工人 检查 请求, ③ 客户 付款, ④ 工人 填写 记录, ⑤ 工人 取车;
时序图 :
对象位置 :
−−顶部: − − 顶 部 : 时序图中对象的默认位置是在时序图顶部, 这表明对象在交互开始之间就已经存在;
−−中间: − − 中 间 : 如果对象在时序图中间部分, 说明对象时在交互过程中创建的;
交互过程中创建对象的方法 :
−−消息指向对象: − − 消 息 指 向 对 象 : 消息是构造方法, 箭头指向对象所代表的的矩形;
−−消息指向激活条: − − 消 息 指 向 激 活 条 : 消息是构造方法, 箭头指向对象下面的激活条;
撤销对象 : 如果想要在时序图中撤销一个对象, 因为如果同时有几个对象, 如果不进行特殊操作其生命周期将会一样长;
−−效果图: − − 效 果 图 : 下图中将 Customer 和 Order 对象撤消了, 因为它们基本没有参与后期的交互;
时序图使用时机 : 对动态行为建模, 强调时间展开信息的次序的时候, 使用时序图;
时序图管理策略 :
−−单一控制流: − − 单 一 控 制 流 : 一个单独的时序图只能显示一个控制流;
−−多个时序图: − − 多 个 时 序 图 : 完整的控制流很复杂, 可以绘制多个时序图, 一个主干时序图, 多个分支时序图, 使用包对这些时序图进行管理;
时序图建模策略 :
−−设置交互语境: − − 设 置 交 互 语 境 : 交互所在的环境, 包括哪些对象, 属于什么系统, 子系统, 相关的操作 类 用例等;
−−对象排列顺序: − − 对 象 排 列 顺 序 : 根据对象重要性, 从左到右排列在时序图中;
−−对象生命线: − − 对 象 生 命 线 : 对象通常存在于交互的整个过程, 也可以在交互过程中被创建和撤销;
−−消息排列: − − 消 息 排 列 : 引发交互信息之后, 消息按照时间顺序从上向下画出, 先发出的消息 在 后发出的消息上面;
−−激活期设置: − − 激 活 期 设 置 : 可以将实际操作发生的 时间点 消息 明确的显示出来;
−−时间空间约束: − − 时 间 空 间 约 束 : 每个消息都可以附加合适的时间 和 空间约束;
−−前置后置条件: − − 前 置 后 置 条 件 : 每条消息可以附加 前置 或 后置 条件;
虚线箭头指向依赖;
实线箭头指向关联;
虚线三角指向接口;
实线三角指向父类;
空心菱形能分离而独立存在,是聚合;
为什么需要类图?类图的作用
类图(Class diagram)主要用于描述系统的结构化设计。类图也是最常用的UML图,用类图可以显示出类、接口以及它们之间的静态结构和关系。
怎么画类图?用什么工具?
使用工具:Visio或者processon在线作图
在类图中一共包含了以下几种模型元素,分别是:类(Class)、接口(Interface)以及类之间的关系。
上面是UML的语法。
在画类图的时候,理清类和类之间的关系是重点。类的关系有泛化(Generalization)、实现(Realization)、依赖(Dependency)和关联(Association)。其中关联又分为一般关联关系和聚合关系(Aggregation),合成关系(Composition)。下面我们结合实例理解这些关系。
类图是面向对象系统建模中最常用和最重要的图,是定义其它图的基础。类图主要是用来显示系统中的类、接口以及它们之间的静态结构和关系的一种静态模型。
在面向对象(OO) 编程中,类是对现实世界中一组具有相同特征的物体的抽象。
接口是一种特殊的类,具有类的结构但不可被实例化,只可以被实现(继承)。在UML中,接口使用一个带有名称的小圆圈来进行表示。
在UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Realization),关联(Association),聚合(Aggregation),组合(Composition),依赖(Dependency)
【泛化关系】:是一种继承关系,表示一般与特殊的关系,它指定了子类如何特化父类的所有特征和行为。
表示is-a的关系,是对象之间耦合度最大的一种关系,子类继承父类的所有细节。直接使用语言中的继承表达。在类图中使用带三角箭头的实线表示,箭头从子类指向父类。
例如:老虎是动物的一种,即有老虎的特性也有动物的共性。
【实现关系】:是一种类与接口的关系,表示类是接口所有特征和行为的实现.
在类图中就是接口和实现的关系。这个没什么好讲的。在类图中使用带三角箭头的虚线表示,箭头从实现类指向接口。
【箭头指向】:带三角箭头的虚线,箭头指向接口
【依赖关系】:对象之间最弱的一种关联方式,是临时性的关联。代码中一般指由局部变量、函数参数、返回值建立的对于其他对象的调用关系。一个类调用被依赖类中的某些方法而得以完成这个类的一些职责。在类图使用带箭头的虚线表示,箭头从使用类指向被依赖的类。
是一种使用的关系,即一个类的实现需要另一个类的协助,
所以要尽量不使用双向的互相依赖.
【代码表现】:局部变量、方法的参数或者对静态方法的调用
【关联关系】: 对象之间一种引用关系,比如客户类与订单类之间的关系。这种关系通常使用类的属性表达。关联又分为一般关联、聚合关联与组合关联。后两种在后面分析。在类图使用带箭头的实线表示,箭头从使用类指向被关联的类。可以是单向和双向。
是一种拥有的关系,它使一个类知道另一个类的属性和方法;如:老师与学生,
丈夫与妻子关联可以是双向的,也可以是单向的。
双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。
【代码体现】:成员变量
上图中,老师与学生是双向关联,老师有多名学生,学生也可能有多名老师。
但学生与某课程间的关系为单向关联,一名学生可能要上多门课程,课程是个抽象的东西他不拥有学生。
【聚合关系】: 是整体与部分的关系,且部分可以离开整体而单独存在。如车和轮胎是整体和部分的关系,轮胎离开车仍然可以存在。
较强于一般关联,有整体与局部的关系,并且没有了整体,局部也可单独存在。如公司和员工的关系,公司包含员工,但如果公司倒闭,员工依然可以换公司。在类图使用空心的菱形表示,菱形从局部指向整体。
聚合关系是关联关系的一种,是强的关联关系;关联和聚合在语法上无法区分,必须考察具体的逻辑关系。
【代码体现】: 成员变量
【箭头及指向】: 带空心菱形的实心线,菱形指向整体表示has-a的关系,是一种不稳定的包含关系。
【组合关系】: 表示contains-a的关系,是一种强烈的包含关系。组合类负责被组合类的生命周期。是一种更强的聚合关系。部分不能脱离整体存在。如公司和部门的关系,没有了公司,部门也不能存在了;调查问卷中问题和选项的关系;订单和订单选项的关系。在类图使用实心的菱形表示,菱形从局部指向整体。
是整体与部分的关系,但部分不能离开整体而单独存在。
如公司和部门是整体和部分的关系,没有公司就不存在部门。
组合关系是关联关系的一种,是比聚合关系还要强的关系,
它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期。
【代码体现】: 成员变量
多重性(Multiplicity) : 通常在关联、聚合、组合中使用。就是代表有多少个关联对象存在。使用数字..星号(数字)表示。如下图,一个割接通知可以关联0个到N个故障单。
聚合和组合的区别
这两个比较难理解,重点说一下。聚合和组合的区别在于:聚合关系是“has-a”关系,组合关系是“contains-a”关系;聚合关系表示整体与部分的关系比较弱,而组合比较强;聚合关系中代表部分事物的对象与代表聚合事物的对象的生存期无关,一旦删除了聚合对象不一定就删除了代表部分事物的对象。组合中一旦删除了组合对象,同时也就删除了代表部分事物的对象。
实例分析
联通客户响应OSS。系统有故障单、业务开通、资源核查、割接、业务重保、网络品质性能等功能模块。现在我们抽出部分需求做为例子讲解。
大家可以参照着类图,好好理解。
1. 通知分为一般通知、割接通知、重保通知。这个是继承关系。
2. NoticeService和实现类NoticeServiceImpl是实现关系。
3. NoticeServiceImpl通过save方法的参数引用Notice,是依赖关系。同时调用了BaseDao完成功能,也是依赖关系。
4. 割接通知和故障单之间通过中间类(通知电路)关联,是一般关联。
5. 重保通知和预案库间是聚合关系。因为预案库可以事先录入,和重保通知没有必然联系,可以独立存在。在系统中是手工从列表中选择。删除重保通知,不影响预案。
6. 割接通知和需求单之间是聚合关系。同理,需求单可以独立于割接通知存在。也就是说删除割接通知,不影响需求单。
7. 通知和回复是组合关系。因为回复不能独立于通知存在。也就是说删除通知,该条通知对应的回复也要级联删除。
经过以上的分析,相信大家对类的关系已经有比较好的理解了。大家有什么其它想法或好的见解,欢迎拍砖。
PS:还是那句话:以上类图用Enterprise Architect 7.5所画,在此推荐一下EA,非常不错。可以替代Visio和Rose了。Visio功能不够强大,Rose太重。唯有EA比较合适。