PlantUML——序列图

PlantUML序列图

1、序列图的基本概念

序列图是对象之间传送消息的时间顺序的可视化表示。序列图从一定程度上更加详细地描述了用例的需求,将其转化为更正式的精细表达,这也是序列图的主要用途之一。序列图的目的在于描述系统中各个对象按照时间顺序的交互过程。

1.1、序列图的定义

所谓交互(Interaction)是指在具体语境中为实现某个目标的一组对象之间进行一组消息交换的行为。一个结构良好的交互过程类似于算法,简单、易于理解和修改。UML提供的交互机制通常会对两种情况进行建模,分别是为系统的动态行为进行建模和为系统的控制过程进行建模。面向系统的动态行为进行建模时,针对系统为实现自身的某个功能而展开的一组动态行为进行描述,其中包含描述一组彼此关联、相互作用的对象间的动作序列和配合关系,以及这些对象间传递和接收的消息。面向控制流进行建模时,可以针对一个用例、一个业务或系统操作过程,也可以针对整个系统,描述这类控制问题的着眼点是消息在系统内如何按照时间顺序发送、接收和处理。

序列图(Sequence Diagram)和协作图(Collaboration Diagram)都是交互图,并彼此等价。序列图用于表现一个交互过程,该交互过程是一个协作中的各种类元角色间的一组消息交换,侧重于强调时间顺序。

在UML的表示中,序列图将交互关系表示为一个二维图。其中,纵向是时间轴,时间沿纵轴向下延伸。横向代表了在协作中各独立对象的角色,角色使用生命线进行表示,当对象存在时,生命线用一条虚线来表示,此时对象不处于激活状态,当对象的过程处于激活状态时,生命线是一个双道线。序列图中的消息用从一个对象的生命线到另一个对象生命线的箭头表示。箭头以时间顺序在图中从上到下排列。

如图所示,这是一个学生查看自身信息的序列图。在这个序列图中,涉及3个对象之间的交互,分别是Student(李明)​、WebInterface(登录页面)和DataManager(数据管理)​。​"Student"​(李明)首先通过WebInterface(登录页面)进行登录,WebInterface(登录页面)需要通过DataManager(数据管理)获得用户"Student"​(李明)的验证信息。成功验证之后,​"Student"​(李明)通过WebInterface(登录页面)向DataManager(数据管理)获取自己的信息并显示在自己的客户端。

序列图中包含了4个基本的模型元素,分别是:

  • 对象(Object)
  • 生命线(Lifeline)
  • 激活(Activation)
  • 消息(Message)

1.2、序列图的作用

序列图是用于描述在给定场景中消息是如何在对象间传递的一种图形化方式,在使用它进行建模时,可以将它的用途分为以下三个方面:

  • 确认和丰富使用场景的一种逻辑表达方式。系统使用场景的描述就是有关系统潜在的使用方式,一个使用场景的逻辑可能是一个用例的一部分,或是一条控制流。
  • 细化用例的表达方式。如前文所述,序列图的主要用途之一,就是把用例表达的需求转化为更正式的精细表达。
  • 有效地描述如何分配各个类的职责以及各个类具有相应职责的原因。可以根据对象之间的交互关系来定义类的职责,各个类之间的交互关系构成一个特定的用例。例如,"Customer对象向Address对象请求其街道名称"指出了Customer对象应该具有"知道其街道名"这个职责。

一般认为,序列图只对开发者有意义。然而,一个组织的业务人员会发现,序列图描述了不同的业务对象是如何交互的,对于沟通当前业务如何进行是很有用的。除了记录组织的当前事件之外,业务级的序列图甚至可以被当作需求文件来使用,为实现一个未来系统提供有效的需求信息。

2、序列图的组成

序列图(Sequence Diagram)是由对象(Object)​、生命线(Lifeline)​、激活(Activation)和消息(Message)等构成的。序列图的目的就是按照交互发生的一系列顺序,表述对象之间的这些交互过程。

2.1、对象(Object)

序列图中的对象和对象图中的对象概念是一样的,都是类的实例。序列图中的对象可以是系统的参与者或者任何有效的系统对象。对象的表示形式也和对象图中的对象表示形式一样,使用包围名称的矩形框来标记,所显示的对象及其类的名称带有下划线,二者用冒号分隔开,使用"对象名:类名"的形式,对象的下部有一条被称为"生命线"的垂直虚线,如图所示。

如果对象的开始位置置于序列图的顶部,那就意味着序列图在开始交互的时候该对象就已经存在了,如果对象的位置不在顶部,那么表明对象在交互的过程中将被创建。

在序列图中,可以通过以下几种方式使用对象:

  • 使用对象生命线来建立类与对象行为的模型,这也正是序列图的主要目的。
  • 不指定对象的类,先用对象创建序列图,随后再指定它们所属的类。这样可以描述系统的一个使用场景。
  • 区分同一个类的不同对象之间如何交互时,则首先应给出对象命名,然后描述同一类对象的交互。也就是说,同一个序列图中的几条生命线可以表示同一个类的不同对象,两个对象之间的区分是根据对象名称进行区分的。
  • 表示类的生命线可以与表示该类对象的生命线平行存在。可以将表示类的生命线对象名称设置为类的名称。

通常将一个交互的发起对象称为主角,对于大多数业务应用软件来讲,主角通常是一个人或一个组织。主角实例通常由序列图中的第一条(最左侧)生命线来表示,也就是把它们放在模型的"可以看见的开始之处"​。如果在同一序列图中有多个主角实例,就应尽量使它们位于最左侧或最右侧的生命线。同样,那些与主角交互的角色被称为系统响应角色,通常放在图的右边。在许多的业务应用软件中,这些系统响应角色经常被称为"Backend Entities"​(后台实体)​,也就是那些通过访问技术提供交互服务的系统,例如消息队列、Web服务等。

2.2、生命线(Lifeline)

生命线(Lifeline)是一条垂直的虚线,用来表示序列图中的对象在一段时间内的存在。在序列图中,每个对象的底部中心的位置都带有生命线。生命线是一条时间线,在序列图中自上而下,所用时间取决于交互持续的时间,也就是说生命线表现了对象存在的时段。

对象与生命线结合在一起称为对象生命线。对象存在的时段包括对象拥有控制线程时或被动对象在控制线程通过时。当对象拥有控制线程时,对象被激活,作为线程的根。被动对象在控制线程通过时,也就是被动对象被外部调用时,通常称为对象的活动,它存在的时间包括过程调用下层过程的时间。

对象生命线包含矩形的对象图和对象图下面的生命线,如图所示。

生命线之间的箭头代表对象之间的消息传递,被箭头指向的对象表示该对象接收消息,通常由一个操作来完成,箭尾对应的对象表示该对象发送消息,由一个操作激活。生命线之间箭头排列的顺序,代表了消息的时间顺序。

2.3、激活(Activation)

序列图可以描述对象的激活(Activation)​,激活是对象操作(或方法)的执行,它表示一个对象直接地完成操作的过程,或通过从属操作完成操作的过程。它用于对执行的持续时间和与其调用者之间的控制关系进行建模。激活就是执行某个操作的实例,它包括这个操作调用其他从属操作的过程。

在序列图中,激活使用一个细长的矩形框来表示,它的顶端与激活时间对齐,而底端与完成时间对齐。被执行的操作根据不同风格表示成一个附在激活符号旁或左边空白处的数字标号。消息的符号也可表示被执行的操作,在这种情况下,激活上的数字标号就可以省略。如果控制流是过程性的,那么激活符号的顶部位于激发该活动的消息箭头指向的位置,而符号的底部位于返回消息箭头的尾部。

如图所示,图中包含一个递归调用和其他两个操作。

2.4、消息(Message)

消息(Message)是从一个对象(发送者)向另一个或其他几个对象(接收者)发送信号,或由一个对象(发送者或调用者)调用另一个对象(接收者)的操作。它可以有不同的实现方式,比如过程调用、活动线程间的内部通信、事件的发生等。

从消息的定义可以看出,消息由三部分组成,分别是发送者、接收者和活动。所谓发送者是发出消息的类元角色。接收者是接收到消息的类元角色,接收消息的一方也被认为是事件的实例。接收者有两种不同的调用处理方式可以选用,通常由接收者的模型所决定。一种方式是操作作为方法实现,当信号到来时它将被激活。过程执行完后,调用者收回控制权,并可以收回返回值。另一种方式是主动对象,操作调用可能导致调用事件,它触发一个状态机转换。活动为调用、信号、发送者的局部操作或原始活动,如创建或销毁等。

在序列图中,消息的表示形式为从一个对象(发送者)的生命线指向另一个对象(目标)生命线的箭头。在Rational Rose 2007序列图的图形编辑工具栏中,消息有下列几种形式见表所示。

如图所示,在序列图中,显示了五种消息的图形表示形式。

除此之外,我们还可以利用消息的规范设置消息其他类型,比如同步(Synchronous)消息、阻止(Balking)消息和超时(Timeout)消息等。同步消息表示发送者发出消息后等待接收者响应这个消息。阻止(Balking)消息表示发送者发出消息给接收者,如果接收者无法立即接收消息,则发送者放弃这个消息。超时(Timeout)消息表示发送者发出消息给接收者,如果接收者超过一定时间未响应,则发送者放弃这个消息。

在Rational Rose 2007还可以设置消息的频率。消息的频率可以让消息按规定时间间隔发送,例如每10秒发送一次消息。主要包括两种设置:定期(Periodic)和不定期(Aperiodic)​。定期消息按照固定的时间间隔发送。不定期消息,只发送一次,或者在不规则时间发送。

消息按时间顺序从顶到底垂直排列。如果多条消息并行,它们之间的顺序不重要。消息可以有序号,但因为顺序是用相对关系表示的,通常也可以省略序号。在RationalRose 2007中,可以设置是否显示序号。设置是否显示序号的步骤为:在菜单栏中选择"Tools"​(工具)下的"Options"​(选项)选项,在弹出的对话框中选择"Diagram"​(图)选项卡,如图所示,选择或取消"Sequence Numbering"选项。

3、序列图的高级概念

3.1、创建对象与销毁对象

创建一个对象就是指发送者发送一个实例化消息后实例化一个对象的操作。在创建对象的消息操作中,可以有参数,用于新生对象实例的初始化。类属性的初始值表达式是通常由创建操作计算的,其结果用于属性的初始化。当然也可以隐式取代这些值,因此初始值表达式是可重载的默认项。创建操作后,新的对象遵循其类的约束,并可以接收消息。

销毁对象指的是将对象销毁并回收其拥有的资源,它通常是一个明确的动作,也可以是其他动作、约束或垃圾回收机制的结果。销毁一个对象将导致对象的所用组成部分将被销毁,但是不会销毁一般关联或者聚集关系连接的对象,尽管它们之间包含该对象的链接将被消除。

在序列图中,创建对象操作的执行使用消息的箭头表示,箭头指向被创建对象的框。对象创建之后就会具有生命线,就像序列图中的任何其他对象一样。对象符号下方是对象的生命线,它持续到对象被销毁或者序列图结束。

在序列图中,对象被销毁是使用在对象的生命线上画大"×"表示,在销毁新创建的对象,或者序列图中的任何其他对象时,都可以使用。它的位置是在导致对象被销毁的信息上,或者在对象自我终结的地方。

创建对象与销毁对象的示例如图所示,在该例中创建了一个"对话框"对象并将其销毁。

3.2、分支与从属流

在UML中,存在两种方式可以来修改序列图中消息的控制流,分别是:分支和从属流。

  • 分支是指的是从同一点发出多个消息的并指向不同的对象,根据条件判断是否互斥,可以有条件和并行两种结构。
  • 从属流指的是从同一点发出多个消息指向同一个对象的不同生命线。

引起一个对象的消息产生分支可以有很多种情况,在复杂的业务处理过程中,要根据不同的条件进入不同的处理流程中,这通常被称作条件分支,另外一种情况是当执行到某一点的时候需要向两个或两个以上对象发送消息,消息是并行的,这时被称为并行分支。

由于序列图只表示某一个活动按照时间顺序的经历过程,因此在Rational Rose 2007中,对序列图的画法没有明显地支持,虽然说我们也可以通过添加脚本的方式来辅助画出序列图。对于出现不同分支的情况,如果有必要,可以针对每一个分支画出一个序列图。一般来说,在序列图中只要画出主要分支过程就足够了。

在UML 2.5中,可以使用两种方法来临时解决分支的问题,一种是在序列图中产生分支的地方插入一个引用的方式。对于每个分支,分别用一个单独的序列图来表示。这种方法要求分支后不再聚合,并且各分支间没有太多具体关联。另一种方法是对于非常复杂的业务来说,可以采用协作图和序列图相辅助的方法来表达完整的信息,另外还可以利用状态图和活动图,其中状态机中对分支有良好的表达。

从属流是从对象的由于不同的条件而根据执行了不同的生命线分支。如用户在保存或删除一个文件时,向文件系统发送一条消息,文件系统会根据保存或删除消息条件的不同执行不同的生命线。从属流在Rational Rose 2007中也不支持,可以通过并发表达方式,因为添加从属流以后会明显增加序列图的复杂度。

3.3、帧化序列图

从UML2.0版本开始,对UML图形增加了一个补充,称作框架的符号元件。它被用于作为许多其他的图元件的一个基础,但是通常被人们用作图的图形化边界。当为图提供图形化边界时,一个框架元件为图的标签提供一致的位置。在UML图中,框架元件是可选择的,图的标签被放在左上角,使用一种卷角长方形表示,而且实际的UML图被封闭在较大的长方形内部定义,如图7-8所示。当使用一个框架元件封闭一个图时,图的标签需要按照以下的格式:图形类型图名称。UML规范给出图形类型提供了特定的文本值,比如,sd代表序列图,activity代表活动图,use case代表用例图。

借助于框架的符号元件,我们可以将序列图进行帧化,如图所示。将序列图进行帧化的目的是使用户能够在一张序列图中快速容易地复用另一张序列图的部分或全部内容。因为在为一个用例的多个场景创建实例过程中,图和图之间的通常有相当一部分内容是重复的。通过帧化,先在一部分图的周围绘制一个帧,标识出帧的隔离区,然后只要把带有标记的帧插入到一个新图中就可以实现复用了。在Rational Rose 2007中不支持将序列图进行帧化。

4、PlantUML语法

4.1、基本示例

  • 在 PlantUML 序列图中,-> 序列表示两个参与者之间发送的消息,它是自动识别的,不需要事先声明。
  • 通过使用--> 序列,利用虚线箭头,在您的图中提供独特的可视化。
  • 为了提高可读性而不影响可视化表示,可使用反向箭头,如 <-<-- 。但要注意,这是专门针对序列
    图的,其他图类型的规则有所不同。
js 复制代码
@startuml
Alice -> Bob: Authentication Request
Bob --> Alice: Authentication Response
Alice -> Bob: Another authentication Request
Alice <-- Bob: Another authentication Response
@enduml

4.2、声明参与者

  • 如果使用关键字 participant 来声明参与者,就可以对该参与者进行更多的控制。
  • 声明的顺序将是(默认的)显示顺序。
  • 使用这些其他的关键字来声明参与者,将改变参与者的表示形状。
    • actor(角色)
    • boundary(边界)
    • control(控制)
    • entity(实体)
    • database(数据库)
    • collections(集合)
    • queue(队列)
js 复制代码
@startuml
participant Participant as Foo
actor Actor as Foo1
boundary Boundary as Foo2
control Control as Foo3
entity Entity as Foo4
database Database as Foo5
collections Collections as Foo6
queue Queue as Foo7
Foo -> Foo1 : To actor
Foo -> Foo2 : To boundary
Foo -> Foo3 : To control
Foo -> Foo4 : To entity
Foo -> Foo5 : To database
Foo -> Foo6 : To collections
Foo -> Foo7: To queue
@enduml
  • 使用 as 关键字重命名参与者。
  • 也可以改变演员或参与者的背景颜色。
js 复制代码
@startuml
actor Bob #red
' The only difference between actor
'and participant is the drawing
participant Alice
participant "I have a really\nlong name" as L #99FF99
/' You can also declare:
participant L as "I have a really\nlong name" #99FF99
'/
Alice->Bob: Authentication Request
Bob->Alice: Authentication Response
Bob->L: Log transaction
@enduml
  • 可以使用 order 关键字来定制参与者的显示顺序
js 复制代码
@startuml
participant Last order 30
participant Middle order 20
participant First order 10
@enduml

4.3、多行定义参与者

js 复制代码
@startuml
participant Participant [
=Title
----
""打算""
]
participant Bob
Participant -> Bob
@enduml

4.4、在参与者中使用非字母

可以使用引号来定义参与者。而且你可以使用 as 关键字来给这些参与者一个别名。

js 复制代码
@startuml
Alice -> "Bob()" : Hello
"Bob()" -> "This is very\nlong" as Long
' You can also declare:
' "Bob()" -> Long as "This is very\nlong"
Long --> "Bob()" : ok
@enduml

4.5、给自己发消息

  • 参与者可以给自己发信息,
  • 消息文字可以用\n 来换行。
js 复制代码
@startuml
Alice -> Alice: This is a signal to self.\nIt also demonstrates\nmultiline \ntext
@enduml

4.6、文本对齐

  • 箭头上的文本对齐可以用 skinparam sequenceMessageAlign,后接参数 left,rightcenter
  • 也可以使用 directionreverseDirection 来根据箭头的方向对齐文本。更多细节可参考 skinparam
js 复制代码
@startuml
skinparam sequenceMessageAlign right
Bob -> Alice : Request
Alice -> Bob : Response
@enduml
4.6.1、让响应信息显示在箭头下面

可以使用 skinparam responseMessageBelowArrow true 命令,让响应信息显示在箭头下面。

js 复制代码
@startuml
skinparam responseMessageBelowArrow true
Bob -> Alice : hello
Bob <- Alice : ok
@enduml

4.7、改变箭头样式

可以通过以下几种方式改变箭头样式:

  • 添加最后的 x 表示丢失的信息
  • 使用\/ 而不是 <> 只拥有箭头的底部或顶部部分
  • 重复箭头头(例如 >>// )头,拥有一个薄的图纸
  • 使用-- 而不是- 拥有一个点状箭头
  • 在箭头头添加最后的"o"
  • 使用双向的箭头 <->
js 复制代码
@startuml
Bob ->x Alice
Bob -> Alice
Bob ->> Alice
Bob -\ Alice
Bob \\- Alice
Bob //-- Alice
Bob ->o Alice
Bob o\\-- Alice
Bob <-> Alice
Bob <->o Alice
@enduml

4.8、修改箭头颜色

可以用以下记号修改箭头的颜色:

js 复制代码
@startuml
Bob -[#red]> Alice : hello
Alice -[#0000FF]->Bob : ok
@enduml

4.9、对消息序列编号

关键字 autonumber 用于自动对消息编号。

js 复制代码
@startuml
autonumber
Bob -> Alice : Authentication Request
Bob <- Alice : Authentication Response
@enduml

语句 autonumber //start// 用于指定编号的初始值,而 autonumber //start// //increment// 可以同时指定编号的初始值和每次增加的值。

js 复制代码
@startuml
autonumber
Bob -> Alice : Authentication Request
Bob <- Alice : Authentication Response
autonumber 15
Bob -> Alice : Another authentication Request
Bob <- Alice : Another authentication Response
autonumber 40 10
Bob -> Alice : Yet another authentication Request
Bob <- Alice : Yet another authentication Response
@enduml
  • 可以在双引号内指定编号的格式。
  • 格式是由 Java 的 DecimalFormat 类实现的:(0 表示数字;# 也表示数字,但默认为 0)。
  • 也可以用 HTML 标签来制定格式。
js 复制代码
@startuml
autonumber "<b>[000]"
Bob -> Alice : Authentication Request
Bob <- Alice : Authentication Response
autonumber 15 "<b>(<u>##</u>)"
Bob -> Alice : Another authentication Request
Bob <- Alice : Another authentication Response
autonumber 40 10 "<font color=red><b>Message 0 "
Bob -> Alice : Yet another authentication Request
Bob <- Alice : Yet another authentication Response
@enduml

还可以用语句 autonumber stopautonumber resume //increment// //format// 来表示暂停或继续使用自动编号。

js 复制代码
@startuml
autonumber 10 10 "<b>[000]"
Bob -> Alice : Authentication Request
Bob <- Alice : Authentication Response
autonumber stop
Bob -> Alice : dummy
autonumber resume "<font color=red><b>Message 0 "
Bob -> Alice : Yet another authentication Request
Bob <- Alice : Yet another authentication Response
autonumber stop
Bob -> Alice : dummy
autonumber resume 1 "<font color=blue><b>Message 0 "
Bob -> Alice : Yet another authentication Request
Bob <- Alice : Yet another authentication Response
@enduml
  • 也可以使用一个 2 或 3 位的序列,中间采用一种或几种分隔符,如.,;,,,:。例如:1.1.11.1:1 。最后一位数字会自动递增。
  • 要增加第一个数字,请使用:autonumber inc A 。要增加第二位数字,请使用:autonumber inc B
js 复制代码
@startuml
autonumber 1.1.1
Alice -> Bob: Authentication request
Bob --> Alice: Response
autonumber inc A
'Now we have 2.1.1
Alice -> Bob: Another authentication request
Bob --> Alice: Response
autonumber inc B
'Now we have 2.2.1
Alice -> Bob: Another authentication request
Bob --> Alice: Response
autonumber inc A
'Now we have 3.1.1
Alice -> Bob: Another authentication request
autonumber inc B
'Now we have 3.2.1
Bob --> Alice: Response
@enduml

也可以用 autonumber 的值,带有%autonumber% 变量。

js 复制代码
@startuml
autonumber 10
Alice -> Bob
note right
the <U+0025>autonumber<U+0025> works everywhere.
Here, its value is ** %autonumber% **
end note
Bob --> Alice: //This is the response %autonumber%//
@enduml

4.10、页面标题、页眉和页脚

  • title 关键字用于为页面添加标题。
  • 页面可以使用 headerfooter 显示页眉和页脚。
js 复制代码
@startuml
header Page Header
footer Page %page% of %lastpage%
title Example Title
Alice -> Bob : message 1
Alice -> Bob : message 2
@enduml

4.11、分割示意图

  • 关键字 newpage 用于把一张图分割成多张。
  • 在 newpage 之后添加文字,作为新的示意图的标题。这样就能很方便地在 Word 中将长图分几页打印。
js 复制代码
@startuml
Alice -> Bob : message 1
Alice -> Bob : message 2
newpage
Alice -> Bob : message 3
Alice -> Bob : message 4
newpage A title for the\nlast pagel
Alice -> Bob : message 5
Alice -> Bob : message 6
@enduml

4.12、组合消息

我们可以通过以下关键词来组合消息:

  • alt/else
  • opt
  • loop
  • par
  • break
  • critical
  • group, 后面紧跟着消息内容

可以在标头 (header) 添加需要显示的文字,关键词 end 用来结束分组。注意,分组可以嵌套使用。

js 复制代码
@startuml
Alice -> Bob: 认证请求
alt 成功情况
    Bob -> Alice: 认证接受
else 某种失败情况
    Bob -> Alice: 认证失败
    group 我自己的标签
    Alice -> Log : 开始记录攻击日志
        loop 1000次
            Alice -> Bob: DNS 攻击
        end
    Alice -> Log : 结束记录攻击日志
    end
else 另一种失败
    Bob -> Alice: 请重复
end
@enduml

4.13、次级分组标签

对于 group 而言,在标头处的 [] 之间可以显示次级文本或标签。

js 复制代码
@startuml
Alice -> Bob: 认证请求
Bob -> Alice: 认证失败
group 我自己的标签 [我自己的标签2]
    Alice -> Log : 开始记录攻击日志
    loop 1000次
        Alice -> Bob: DNS攻击
    end
    Alice -> Log : 结束记录攻击日志
end
@enduml

4.14、注释信息

  • 可以使用 note leftnote right 关键字在信息后面加上注释。
  • 可以使用 end note 关键字有一个多行注释。
js 复制代码
@startuml
Alice->Bob : hello
note left: this is a first note

Bob->Alice : ok
note right: this is another note

Bob->Bob : I am thinking
note left
a note
can also be defined
on several lines
end note
@enduml

4.15、其他的注释信息方式

  • 可以使用 note left ofnote right ofnote over 在节点 (participant) 的相对位置放置注释。
  • 还可以通过修改背景色来高亮显示注释。
  • 以及使用关键字 end note 来添加多行注释。
js 复制代码
@startuml
participant Alice
participant Bob
note left of Alice #aqua
This is displayed
left of Alice.
end note
note right of Alice: This is displayed right of Alice.
note over Alice: This is displayed over Alice.
note over Alice, Bob #FFAAAA: This is displayed\n over Bob and Alice.
note over Bob, Alice
This is yet another
example of
a long note.
end note
@enduml

4.16、改变备注框的形状 hnote 和 rnote

可以使用 hnoternote 这两个关键字来修改备注框的形状:

  • hnote 代表六边形(hexagonal)的备注框;
  • rnote 代表正方形(rectangle)的备注框。
js 复制代码
@startuml
caller -> server : conReq
hnote over caller : 空闲
caller <- server : conConf
rnote over server
"r"是正方形
"h"是六边形
endrnote
rnote over server
多
行
文本
endrnote
hnote over caller
多
行
文本
endhnote
@enduml

4.17、在多个参与者添加备注 across

可以之直接在所有参与者之间添加备注,格式是:

  • note across: 备注描述
js 复制代码
@startuml
Alice->Bob:m1
Bob->Charlie:m2
note over Alice, Charlie: 创建跨越所有参与者的备注的旧方法:\n ""note over //FirstPart, LastPart//""note across: 新方法:\n""note across""
Bob->Alice
hnote across: 跨越所有参与者的备注。
@enduml

4.18、在同一级对齐多个备注 /

使用/可以在同一级对齐多个备注:

  • 没有/ (默认情况下,备注不是对齐的。)
js 复制代码
@startuml
note over Alice : Alice的初始状态
note over Bob : Bob的初始状态
Bob -> Alice : hello
@enduml
js 复制代码
@startuml
note over Alice : Alice的初始状态
/ note over Bob : Bob的初始状态
Bob -> Alice : hello
@enduml

4.19、Creole 和 HTML

可以使用 creole 格式。

js 复制代码
@startuml
participant Alice
participant "The **Famous** Bob" as Bob
Alice -> Bob : hello --there--
... Some ~~long delay~~ ...
Bob -> Alice : ok
note left
This is **bold**
This is //italics//
This is ""monospaced""
This is --stroked--
This is __underlined__
This is ~~waved~~
end note
Alice -> Bob : A //well formatted// message
note right of Alice
This is <back:cadetblue><size:18>displayed</size></back>
__left of__ Alice.
end note
note left of Bob
<u:red>This</u> is <color #118888>displayed</color>
**<color purple>left of</color> <s:red>Alice</strike> Bob**.
end note
note over Alice, Bob
<w:#FF33FF>This is hosted</w> by <img sourceforge.jpg>
end note
@enduml

4.20、分隔符

可以通过使用 == 关键词来将你的图表分割成多个逻辑步骤。

js 复制代码
@startuml
== 初始化 ==
Alice -> Bob: 认证请求
Bob --> Alice: 认证响应
== 重复 ==
Alice -> Bob: 认证请求
Alice <-- Bob: 认证响应
@enduml

4.21、引用

可以在图中通过使用 ref over 关键词来实现引用

js 复制代码
@startuml
participant Alice
actor Bob
ref over Alice, Bob : init
Alice -> Bob : hello
ref over Bob
This can be on
several lines
end ref
@enduml

4.22、延迟

可以使用... 来表示延迟,并且还可以给延迟添加注释。

js 复制代码
@startuml
Alice -> Bob: 认证请求
...
Bob --> Alice: 认证响应
...5分钟后...
Bob --> Alice: 再见!
@enduml

4.23、文本换行

  • 可以通过手动在文本中添加\n 使长文本换行。
  • 或者使用 maxMessageSize 设置(此方式暂不支持中文换行)
js 复制代码
@startuml
skinparam maxMessageSize 50
participant a
participant b
a -> b :这\n一条\n是\n手动换行
a -> b :this is a very long message on several words
@enduml

4.24、空间

  • 可以使用 ||| 来增加空间。
  • 还可以使用数字指定增加的像素的数量
js 复制代码
@startuml
Alice -> Bob: message 1
Bob --> Alice: ok
|||
Alice -> Bob: message 2
Bob --> Alice: ok
||45||
Alice -> Bob: message 3
Bob --> Alice: ok
@enduml

4.25、生命线的激活与撤销

  • 关键字 activatedeactivate 用来表示参与者的生命活动。
  • 一旦参与者被激活,它的生命线就会显示出来。
  • activatedeactivate 适用于以上情形。
  • destroy 表示一个参与者的生命线的终结。
js 复制代码
@startuml
participant User
User -> A: DoWork
activate A

A -> B: << createRequest >>
activate B

B -> C: DoWork
activate C
C --> B: WorkDone
destroy C

B --> A: RequestCreated
deactivate B

A -> User: Done
deactivate A
@enduml

还可以使用嵌套的生命线,并且运行给生命线添加颜色。

js 复制代码
@startuml
participant User
User -> A: DoWork
activate A #FFBBBB

A -> A: Internal call
activate A #DarkSalmon

A -> B: << createRequest >>
activate B

B --> A: RequestCreated
deactivate B
deactivate A

A -> User: Done
deactivate A
@enduml

也可以使用自动激活关键字(autoactivate),这需要与 return 关键字配合:

js 复制代码
@startuml
autoactivate on
alice -> bob : hello
bob -> bob : self call
bill -> bob #005500 : hello from thread 2
bob -> george ** : create
return done in thread 2
return rc
bob -> george !! : delete
return success
@enduml

4.26、返回

新命令 return 可以用于生成一个带有可选文本标签的返回信息。返回的点是导致最近一次激活生命线

的点。语法是简单的返回标签,其中标签(如果提供)可以是传统信息中可以接受的任何字符串。

js 复制代码
@startuml
Bob -> Alice : hello
activate Alice
Alice -> Alice : some action
return bye
@enduml

4.27、创建参与者

可以把关键字 create 放在第一次接收到消息之前,以强调本次消息实际上是在创建新的对象。

js 复制代码
@startuml
Bob -> Alice : hello
create Other
Alice -> Other : new
create control String
Alice -> String
note right : You can also put notes!
Alice --> Bob : ok
@enduml

4.28、激活、撤销和创建的快捷语法

在指定目标参与者后,可以立即使用以下语法:

  • ++ 激活目标(可选择在后面加上 #color)
  • -- 撤销激活源
  • ** 创建目标实例
  • !! 摧毁目标实例
js 复制代码
@startuml
alice -> bob ++ : hello
bob -> bob ++ : self call
bob -> bib ++ #005500 : hello
bob -> george ** : create
return done
return rc
bob -> george !! : delete
return success
@enduml

然后你就可以在一行上同时激活和撤销:

js 复制代码
@startuml
alice -> bob ++ : hello1
bob -> charlie --++ : hello2
charlie --> alice -- : ok
@enduml
js 复制代码
@startuml
@startuml
alice -> bob --++ #gold: hello
bob -> alice --++ #gold: you too
alice -> bob --: step1
alice -> bob : step2
@enduml

4.29、进入和发出消息

  • 如果只想关注部分图示,你可以使用进入和发出箭头。
  • 使用方括号 [] 表示图示的左、右两侧。
js 复制代码
@startuml
[-> A: DoWork
activate A

A -> A: Internal call
activate A

A ->] : << createRequest >>
A<--] : RequestCreated
deactivate A

[<- A: Done
deactivate A
@enduml

还可以使用下面的语法:

js 复制代码
@startuml
participant Alice
participant Bob #lightblue
Alice -> Bob
Bob -> Carol
...
[-> Bob
[o-> Bob
[o->o Bob
[x-> Bob
...
[<- Bob
[x<- Bob
...
Bob ->]
Bob ->o]
Bob o->o]
Bob ->x]
...
Bob <-]
Bob x<-]
@enduml

4.30、缩短的进入信息与发出信息箭头

使用? 来显示缩短的箭头。

js 复制代码
@startuml
?-> Alice : ""?->""\n**short** to actor1
[-> Alice : ""[->""\n**from start** to actor1
[-> Bob : ""[->""\n**from start** to actor2
?-> Bob : ""?->""\n**short** to actor2
Alice ->] : ""->]""\nfrom actor1 **to end**
Alice ->? : ""->?""\n**short** from actor1
Alice -> Bob : ""->"" \nfrom actor1 to actor2
@enduml

4.31、锚点和持续时间

使用 teoz 在图表中添加锚点,从而指定持续时间。

js 复制代码
@startuml
!pragma teoz true
{start} Alice -> Bob : start doing things during duration
Bob -> Max : something
Max -> Bob : something else
{end} Bob -> Alice : finish
{start} <-> {end} : some time
@enduml

4.32、构造类型和圈点

  • 可以使用 <<>> 给参与者添加构造类型
  • 在构造类型中,你可以使用 (X,color) 格式的语法添加一个圆圈圈起来的字符
js 复制代码
@startuml
participant "Famous Bob" as Bob << Generated >>
participant Alice << (C,#ADD1B2) Testable >>
Bob->Alice: First message
@enduml

默认使用 guillemet 字符来显示构造类型。你可以使用外观参数 guillemet 来修改显示行为。

js 复制代码
@startuml
skinparam guillemet false
participant "Famous Bob" as Bob << Generated >>
participant Alice << (C,#ADD1B2) Testable >>
Bob->Alice: First message
@enduml
js 复制代码
@startuml
participant Bob << (C,#ADD1B2) >>
participant Alice << (C,#ADD1B2) >>
Bob->Alice: First message
@enduml

4.33、 Position of the stereotypes

js 复制代码
@startuml
skinparam stereotypePosition top
participant A<<st1>>
participant B<<st2>>
A --> B : stereo test
@enduml
js 复制代码
@startuml
skinparam stereotypePosition bottom
participant A<<st1>>
participant B<<st2>>
A --> B : stereo test
@enduml

4.34、更多标题信息

可以在标题中使用 creole 格式。

js 复制代码
@startuml
title __Simple__ **communication** example
Alice -> Bob: Authentication Request
Bob -> Alice: Authentication Response
@enduml

在标题描述中使用\n 表示换行。

js 复制代码
@startuml
title __Simple__ communication example\non several lines
Alice -> Bob: Authentication Request
Bob -> Alice: Authentication Response
@enduml

还可以使用关键字 title 和 end title 定义多行标题。

js 复制代码
@startuml
title
<u>Simple</u> communication example
on <i>several</i> lines and using <font color=red>html</font>
This is hosted by <img:sourceforge.jpg>
end title
Alice -> Bob: Authentication Request
Bob -> Alice: Authentication Response
@enduml

4.35、包裹参与者

  • 可以使用 boxend box 画一个盒子将参与者包裹起来
  • 还可以在 box 关键字之后添加标题或者背景颜色
js 复制代码
@startuml
box "Internal Service" #LightBlue
participant Bob
participant Alice
end box
participant Other
Bob -> Alice : hello
Alice -> Other : hello
@enduml

4.36、移除脚注

使用 hide footbox 关键字移除脚注。

js 复制代码
@startuml
hide footbox
title Footer removed
Alice -> Bob: Authentication Request
Bob --> Alice: Authentication Response
@enduml

4.37、外观参数 (skinparam)

skinparam 改变字体和颜色。可以在如下场景中使用:

  • 在图示的定义中,
  • 在引入的文件中,
  • 在命令行或者 ANT 任务提供的配置文件中。
js 复制代码
@startuml
skinparam sequenceArrowThickness 2
skinparam roundcorner 20
skinparam maxmessagesize 60
skinparam sequenceParticipant underline
actor User
participant "First Class" as A
participant "Second Class" as B
participant "Last Class" as C
User -> A: DoWork
activate A
A -> B: Create Request
activate B
B -> C: DoWork
activate C
C --> B: WorkDone
destroy C
B --> A: Request Created
deactivate B
A --> User: Done
deactivate A
@enduml
js 复制代码
@startuml
skinparam backgroundColor #EEEBDC
skinparam handwritten true
skinparam sequence {
    ArrowColor DeepSkyBlue
    ActorBorderColor DeepSkyBlue
    LifeLineBorderColor blue
    LifeLineBackgroundColor #A9DCDF
    ParticipantBorderColor DeepSkyBlue
    ParticipantBackgroundColor DodgerBlue
    ParticipantFontName Impact
    ParticipantFontSize 17
    ParticipantFontColor #A9DCDF
    ActorBackgroundColor aqua
    ActorFontColor DeepSkyBlue
    ActorFontSize 17
    ActorFontName Aapex
}
actor User
participant "First Class" as A
participant "Second Class" as B
participant "Last Class" as C
User -> A: DoWork
activate A
A -> B: Create Request
activate B
B -> C: DoWork
activate C
C --> B: WorkDone
destroy C
B --> A: Request Created
deactivate B
A --> User: Done
deactivate A
@enduml

4.38、填充区设置

可以设定填充区的参数配置。

js 复制代码
@startuml
skinparam ParticipantPadding 20
skinparam BoxPadding 10
box "Foo1"
participant Alice1
participant Alice2
end box
box "Foo2"
participant Bob1
participant Bob2
end box
Alice1 -> Bob1 : hello
Alice1 -> Out : out
@enduml

4.39、箭头类型大全

4.39.1、普通箭头
js 复制代码
@startuml
participant Alice as a
participant Bob as b
a -> b : ""-> ""
a ->> b : ""->> ""
a -\ b : ""-\ ""
a -\\ b : ""-\\\\""
a -/ b : ""-/ ""
a -// b : ""-// ""
a ->x b : ""->x ""
a x-> b : ""x-> ""
a o-> b : ""o-> ""
a ->o b : ""->o ""
a o->o b : ""o->o ""
a <-> b : ""<-> ""
a o<->o b : ""o<->o""
a x<->x b : ""x<->x""
a ->>o b : ""->>o ""
a -\o b : ""-\o ""
a -\\o b : ""-\\\\o""
a -/o b : ""-/o ""
a -//o b : ""-//o ""
a x->o b : ""x->o ""
@enduml
4.39.2、进入信息(使用'[')
js 复制代码
@startuml
participant Alice as a
participant Bob as b
[-> b : ""[-> ""
[->> b : ""[->> ""
[-\ b : ""[-\ ""
[-\\ b : ""[-\\\\""
[-/ b : ""[-/ ""
[-// b : ""[-// ""
[->x b : ""[->x ""
[x-> b : ""[x-> ""
[o-> b : ""[o-> ""
[->o b : ""[->o ""
[o->o b : ""[o->o ""
[<-> b : ""[<-> ""
[o<->o b : ""[o<->o""
[x<->x b : ""[x<->x""
[->>o b : ""[->>o ""
[-\o b : ""[-\o ""
[-\\o b : ""[-\\\\o""
[-/o b : ""[-/o ""
[-//o b : ""[-//o ""
[x->o b : ""[x->o ""
@enduml
4.39.3、发出信息(使用']')
js 复制代码
@startuml
participant Alice as a
participant Bob as b
a ->] : ""->] ""
a ->>] : ""->>] ""
a -\] : ""-\] ""
a -\\] : ""-\\\\]""
a -/] : ""-/] ""
a -//] : ""-//] ""
a ->x] : ""->x] ""
a x->] : ""x->] ""
a o->] : ""o->] ""
a ->o] : ""->o] ""
a o->o] : ""o->o] ""
a <->] : ""<->] ""
a o<->o] : ""o<->o]""
a x<->x] : ""x<->x]""
a ->>o] : ""->>o] ""
a -\o] : ""-\o] ""
a -\\o] : ""-\\\\o]""
a -/o] : ""-/o] ""
a -//o] : ""-//o] ""
a x->o] : ""x->o] ""
@enduml
4.39.4、短进入信息(使用'?')
js 复制代码
@startuml
participant Alice as a
participant Bob as b
a -> b : //Long long label//
?-> b : ""?-> ""
?->> b : ""?->> ""
?-\ b : ""?-\ ""
?-\\ b : ""?-\\\\""
?-/ b : ""?-/ ""
?-// b : ""?-// ""
?->x b : ""?->x ""
?x-> b : ""?x-> ""
?o-> b : ""?o-> ""
?->o b : ""?->o ""
?o->o b : ""?o->o ""
?<-> b : ""?<-> ""
?o<->o b : ""?o<->o""
?x<->x b : ""?x<->x""
?->>o b : ""?->>o ""
?-\o b : ""?-\o ""
?-\\o b : ""?-\\\\o ""
?-/o b : ""?-/o ""
?-//o b : ""?-//o ""
?x->o b : ""?x->o ""
@enduml
4.39.5、短发出信息(使用'?')
js 复制代码
@startuml
participant Alice as a
participant Bob as b
a -> b : //Long long label//
a ->? : ""->? ""
a ->>? : ""->>? ""
a -\? : ""-\? ""
a -\\? : ""-\\\\?""
a -/? : ""-/? ""
a -//? : ""-//? ""
a ->x? : ""->x? ""
a x->? : ""x->? ""
a o->? : ""o->? ""
a ->o? : ""->o? ""
a o->o? : ""o->o? ""
a <->? : ""<->? ""
a o<->o? : ""o<->o?""
a x<->x? : ""x<->x?""
a ->>o? : ""->>o? ""
a -\o? : ""-\o? ""
a -\\o? : ""-\\\\o?""
a -/o? : ""-/o? ""
a -//o? : ""-//o? ""
a x->o? : ""x->o? ""
@enduml

4.40、特定外观参数

4.40.1、默认情况下
js 复制代码
@startuml
Bob -> Alice : hello
Alice -> Bob : ok
@enduml
4.40.2、生命线策略
  • nosolid 虚线 (默认情况)
js 复制代码
@startuml
skinparam lifelineStrategy nosolid
Bob -> Alice : hello
Alice -> Bob : ok
@enduml
  • solid 实线
  • 在时序图中使用实线生命线:skinparam lifelineStrategy solid
js 复制代码
@startuml
skinparam lifelineStrategy solid
Bob -> Alice : hello
Alice -> Bob : ok
@enduml
4.40.3、style strictuml

为了符合严格 UML 的标准(线头的形状必须是三角形,而不能是箭头形),你可以使用:

  • skinparam style strictuml
js 复制代码
@startuml
skinparam style strictuml
Bob -> Alice : hello
Alice -> Bob : ok
@enduml

4.41、隐藏孤立参与者

默认情况下会显示所有参与者。

js 复制代码
@startuml
participant Alice
participant Bob
participant Carol
Alice -> Bob : hello
@enduml

可以使用 hide unlinked 命令来隐藏未被链接到的参与者

js 复制代码
@startuml
hide unlinked
participant Alice
participant Bob
participant Carol
Alice -> Bob : hello
@enduml

4.42、给分组信息着色

可以给分组信息 color着色

js 复制代码
@startuml
Alice -> Bob: Authentication Request
alt#Gold #LightBlue Successful case
Bob -> Alice: Authentication Accepted
else #Pink Failure
Bob -> Alice: Authentication Rejected
end
@enduml

4.43、Mainframe

js 复制代码
@startuml
mainframe This is a **mainframe**
Alice->Bob : Hello
@enduml

4.44、 Slanted or odd arrows

js 复制代码
@startuml
A ->(10) B: text 10
B ->(10) A: text 10
A ->(10) B: text 10
A (10)<- B: text 10
@enduml
js 复制代码
@startuml
A ->(40) B++: Rq
B -->(20) A--: Rs
@enduml
js 复制代码
@startuml
!pragma teoz true
A ->(50) C: Starts\nwhen 'B' sends
& B ->(25) C: \nBut B's message\n arrives before A's
@enduml
js 复制代码
@startuml
!pragma teoz true
S1 ->(30) S2: msg 1\n
& S2 ->(30) S1: msg 2
note left S1: msg\nS2 to S1
& note right S2: msg\nS1 to S2
@enduml

4.45、并行信息(使用 teoz)

可以使用 & teoz 命令显示并行信息:

js 复制代码
@startuml
!pragma teoz true
Alice -> Bob : hello
& Bob -> Charlie : hi
@enduml
相关推荐
吴声子夜歌4 小时前
PlantUML——活动图
uml·plantuml·活动图
吴声子夜歌1 天前
PlantUML——类图(一)
uml
吴声子夜歌1 天前
PlantUML——类图(二)
uml·plantuml·类图
吴声子夜歌1 天前
PlantUML——对象图
uml·plantuml·对象图
吴声子夜歌2 天前
PlantUML——用例图
uml·plantuml
rolt4 天前
PlantUML描述《分析模式》第4章企业财务观察(1)
产品经理·架构师·uml·系统工程
KobeSacre5 天前
UML 学习
学习·uml
hssfscv7 天前
软件设计师2021上、下上午题错题解析+2022上、下下午题训练5道 练习真题训练16
笔记·设计模式·uml
_codemonster9 天前
UML静态图之构件图(也叫组件图)详解
uml