5分钟看懂uml类图(UML学习-时序图SequenceDiagram)

时序图

时序图(Sequence Diagram)描述了对象之间传递消息的时间顺序,它用来表示用例中的行为顺序,是强调消息时间顺序的交互图。时序图描述类系统中类和类之间的交互,它将这些交互建模成消息交换。也就是说,时序图描述了类以及类间相互交换以完成期望行为

时序图的基本元素

时序图包括了5个基本元素,分别是对象(Object)、生命线(Lifeline)、激活(Activation)、和消息(Message)。

对象(Object):表示参与交互的对象。每个对象都带有一条生命周期线,对象被激活(创建或者被引用)时,生命周期线上会出现一个长条(会话),表示对象的存在。将对象置于时序图的顶部意味着在交互开始的时候对象就已经存在了,如果对象的位置不在顶部,那么表示对象是在交互的过程中被创建的。对象一般包含以下三种命名方式:

  • 第一种方式包含对象名和类名。
  • 第二种方式只显示类名不显示对象名,即为一个匿名对象。
  • 第三种方式只显示对象名不显示类名。

生命线(Lifeline): 生命线是一条垂直的虚线,表示时序图中的对象在一段时间内的存在。每个对象的底部中心的位置都带有生命线。生命线是一个时间线,从时序图的顶部一直延伸到底部,所用的时间取决于交互持续的时间。对象与生命线结合在一起称为对象的生命线;对象的生命线包含对象图标以及图标下面的生命线

激活(Activation)和去激活(Deactivation):时序图通过激活条来描述对象的激活(Activation)和去激活(Deactivation)。激活代表时序图中的对象执行一项操作的时期。激活期可以被理解成C语言语义中一对花括号“{}”中的内容。激活表示该对象被占用以完成某个任务,去激活指的是对象处于空闲状态,在等待消息。在UML中,为了表示对象是激活的,可以将对象的生命线拓宽成为矩形,图中的矩形称为激活条,对象就是在激活条的顶部被激活的。对象在完成自己的工作后被去激活,这通常发生在一个消息箭头离开对象生命线的时候。

消息(Message):消息由一个对象的生命周期线指向另一个对象的生命周期线。如果消息指到空白的生命周期线,将创建一个新的会话;如果消息指到已有的会话,表示该对象延续已有会话。

  • 同步消息(Message):也可以简称消息。同步消息适用于大多数情况。一般情况下使用同步消息就足够了,除非在设计模型的类交互时需要强调消息类型时才使用其他消息类型。同步消息表示发出消息的对象将停止所有后续动作一直等到接收消息方响应。同步消息将阻塞源消息对象的所有行为。同步消息最为常用,通常程序之间的方法调用都是同步消息。

5分钟看懂uml类图(UML学习-时序图SequenceDiagram)(1)

333

  • 返回消息(Reply Message)。返回消息为源消息的返回体,而非新的消息。一般来说不需要为每个源消息都绘制返回消息,一方面因为默认情况下源消息都有返回,另一方面太多的返回消息会使图变得更复杂。

5分钟看懂uml类图(UML学习-时序图SequenceDiagram)(2)

33

  • 异步消息(Async Message)。异步消息类似一次异步调用,本身主流程不会被这次调用阻塞,但需要等到了异步消息的回调。

5分钟看懂uml类图(UML学习-时序图SequenceDiagram)(3)

33

  • 创建消息(Create Message)。实际含义是创建对象的消息,这个消息指向对象以后,对象的位置就不会出现在顶部,而是创建消息所在的位置

5分钟看懂uml类图(UML学习-时序图SequenceDiagram)(4)

  • 删除消息(Delete Message)。实际含义就是销毁对象的消息。会在指向对象激活的生命线的终止点,也就是删除消息指向的地步打一个"X",表示对象被删除。

5分钟看懂uml类图(UML学习-时序图SequenceDiagram)(5)

  • 异步信号消息(Async Signal Message)。这里要解释一下信号和消息不同之处。信号不同于其他消息类型的地方在于:当一个对象接收到信号时,该对象不需要返回任何信息,只需按照它的接收信号指定的行为执行相应的操作。源消息对象发出信号后不等待响应,而可以继续执行其他操作。异步信号消息一般需要消息中间件的支持,如JMS、MQ等。

5分钟看懂uml类图(UML学习-时序图SequenceDiagram)(6)

  • 自关联消息。特殊类型的Message。消息的调用方和被调用方是同一个Object。

5分钟看懂uml类图(UML学习-时序图SequenceDiagram)(7)

时序图的高级元素

掌握了时序图的基本元素以后就能绘制出主要的时序逻辑。但对象和对象直接的交互往往是很复杂的,会出现条件判断、轮训等待、异常处理等情况,时序图要“精确的”表达出来,这些基本元素就不够了,需要借助时序图的高级元素。

组合片段(Combined Fragments) :Fragments的意思是片段。在时序图中用于表示紧密相连有逻辑关系的片段。片段内的内容是完整不可拆分的。主要的片段类型有以下几种

  • 选择(alt):包含一个片段列表,这些片段包含备选消息序列。 在任何场合下只发生一个序列。可以在每个片段中设置一个临界来指示该片段可以运行的条件。 else 的临界指示其他任何临界都不为 True 时应运行的片段。 如果所有临界都为 False 并且没有 else,则不执行任何片段。

5分钟看懂uml类图(UML学习-时序图SequenceDiagram)(8)

333

  • 选项(opt):包含一个可能发生或不发生的序列。

5分钟看懂uml类图(UML学习-时序图SequenceDiagram)(9)

  • 循环(Loop)片段重复一定次数。 可以在临界中指示片段重复的条件。

5分钟看懂uml类图(UML学习-时序图SequenceDiagram)(10)

  • 中断(Break):如果执行此片段,则放弃序列的其余部分。 可以使用临界来指示发生中断的条件,可以和Loop配合使用。下图中先进行的是循环,满足条件就break结束循环。

5分钟看懂uml类图(UML学习-时序图SequenceDiagram)(11)

  • 并行(par):并行处理。 片段中的事件可以并行执行。

5分钟看懂uml类图(UML学习-时序图SequenceDiagram)(12)

  • 临界(Critical):指示此片段中的消息不得与其他消息交错,可以理解成需要加锁单线程访问,例如库存扣减的处理。

5分钟看懂uml类图(UML学习-时序图SequenceDiagram)(13)

  • 忽略(ignore)和考虑(consider):ignore:明确定义了交互片段不应该响应的消息;consider:明确标志了应该被处理的消息。比如说A和B直接交互的消息有Message1、Message2、Message3、Message4这4种类型,当需要对Message1以外所有的消息都要相应处理的场景可以使用忽略(Ignore),而只对Message1或Message2的时候就可以用考虑(Consider)。

5分钟看懂uml类图(UML学习-时序图SequenceDiagram)(14)

  • neg:用来标志不应该发生的交互。例如你上传一个文件,网络超时应该是一种特例,不应该发生。

5分钟看懂uml类图(UML学习-时序图SequenceDiagram)(15)

  • 断言(assert):标志了在交互片段中作为事件是唯一合法的操作集合,换句话说详细设计必须按这个定义去实现,其他的交互片段都是不合法的。

5分钟看懂uml类图(UML学习-时序图SequenceDiagram)(16)

  • strict:多个操作片段必须按照顺序发生。下面就是一个典型的例子,切菜和炒菜属于两个操作片段(operand) ,这两个操作片段的顺序是必须按顺序发生的,是强顺序的。

5分钟看懂uml类图(UML学习-时序图SequenceDiagram)(17)

  • 状态恒定(State Invariant)和延续(Continuation):这个的意思就是约束某个对象要在某一个状态下,举例如下图的意思就是说在 start 开始前,Task 必须要在 Finish 状态。延续也是表达同样的意思,只是可以跨多个生命线。

5分钟看懂uml类图(UML学习-时序图SequenceDiagram)(18)

  • 无触发对象消息(Found Message):用活动条开始断点上的实心球箭头来表示。用在开始,表示没有确定的触发对象。当你只在意被特定事件触发或者调用,而不在意调用方是谁的时候,可以用这种表达方式。
  • 无接收对象消息(Lost message):用箭头加实心球表示。用在结束,表示没有确定的消息接收者。当你核心向表达对外广播一个消息,而没有确定的接收消息的对象。就可以用这种表达方式。
  • 边界(Gate):一个时序图并不一定要求从流程的最开始画起,也不一定会涉及到流程的终点,因此在这个流程里,我们不关注的部分称之为系统边界(gate),表明消息从外部对象产生,最终返回给外部对象。当时序需要和另外一个外部的时序片段相连的时候,就需要通过边界。边界是交互规范的代表。一个时序需要通过一个确定的边界和另外一个时序连起来。
  • 结束(endpoint):流程结束、异常退出的地方用“结束”表示。
编写时序图的要点
  1. 在业务设计和系统设计过程中,过程的梳理和设计是关键的设计之一,静态模型需要通过动态模型(时序图和协作图)来推演和细化。而且时序要考虑很多复杂的情况,比如并发、比如乱序和异步,所以时序的梳理和设计要力求精细,才能在设计阶段发现问题,这也导致时序图特别是高级元素的概念比较复杂,但这些对于做出精细化的设计是很有用的。
  2. 时序图里面还有一个高级概念“Interaction Use”在这个里面没总结到,“Interaction Use”主要是用于表达通用的、被复用的时序,例如“价格计算”就可以定义成一个独立的时序,这个时序在下单和询价过程中都会被用到。这里没有整理的原因是在StarUML里没试出来该如何表达,并可以灵活跳转到引用的交互。
  3. 时序图除了在详细设计阶段用的上,在业务和概念设计阶段其实也是有用的,时序图是用来表达对象和对象之间交互的时间顺序以及行为顺序,不限定是针对设计模型、概念、业务模型。比如通过鲁棒图我们定义了参与者、边界类、控制类、实体类,这些对象直接交互过程也是可以通过时序图来表达的。
时序图示例

5分钟看懂uml类图(UML学习-时序图SequenceDiagram)(19)

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页