目录
1、概念
2、组成结构
2.1、动作
2.2、活动节点
2.3、控制流
2.4、分支
2.5、分岔和汇合
2.6、泳道
2.7、对象流
2.8、扩展区域
3、一般用法
3.1、对工作流建模
3.2、对操作建模
一个活动图从本质上说是一个流程图,展现从活动到活动的控制流
活动图能够展示并发和控制分支。
活动图用于对系统的动态方面建模。
包括对计算过程中顺序的(也可能是并发的)步骤进行建模。
也可以用活动图对步骤之间的值的流动进行建模。
活动图可以单独用来可视化、详述、构造和文档化对象群体的动态特性,也可以用于对一个操作的控制流建模。
交互图强调的是从对象到对象的控制流,而活动图强调的是从步骤到步骤的控制流。
一个活动是行为的一个持续发生的结构化执行。
活动的执行最终延伸为一些单独动作的执行,每个动作都可能改变系统的状态或者传送消息。
甘特图(Gantt chart)和波特图(Pert chart)
一方面,可以建立脚本的故事板,其中包括某些感兴趣的对象之间的交互以及它们之间传递的消息。在UML中,有两种方法对这些故事板建模:强调消息的时间顺序(使用顺序图)或强调参加交互的对象间的结构关系(使用通信图)
另一方面,可以用活动图对这些动态方面建模,它首先关注于对象间发生的活动,如图所示。从这方面看,活动图与波特图类似。活动图本质上是流程图,它强调随着时间的前进而发生的活动。你可以把活动图看作翻新花样的交互图。
交互图观察的是传送消息的对象,而活动图观察的是对象之间传送操作
1、概念
活动图(activity diagram)显示从活动到活动的流。
一个活动(activity)是一个状态机中进行的非原子的执行单元。活动的执行最终延伸为一些独立动作 (action)的执行,每个动作将导致系统状态的改变或消息传送。动作包括调用另一个操作,发送一个信号,创建或撤销一个对象,或者某些纯计算(例如对一个表达式求值)。
在图形上,活动图是顶点和弧的集合。
2、组成结构
动作、活动结点、流、对象值,以及注解和约束
2.1、动作
在一个用活动图建模的控制流中,
1)可能要计算一个设置属性值或返回某个值的表达式。
2)也可能要调用一个对象的操作,发送一个信号给对象,
3)甚至创建或撤销一个对象。
这些可执行的原子计算被称为动作。
如下图所示,用一个两头为圆形的盒子来表示一个动作。在这个图符内部可以写一个表达式。
动作原子性、内部行为可不见、不可拆分、持续性
2.2、活动节点
活动结点 (activity node)是活动的组织单元。
通常,活动结点是内嵌的动作组,或者是其他嵌套的活动结点。
此外,活动结点具有可见的子结构。一般来说,活动结点会持续一段时间来完成。
把动作看成是活动结点的特例。动作是一个不能被进一步分解的活动结点。
类似地,可以把活动结点看作一个组合,它的控制流由其他的活动结点和动作组成。放大一个活动结点的细节,就会发现另一个活动图。
如图所示,在活动结点和动作之间没有表示法上的差别,只是活动结点可以有附加的部分,这些附加部分通常由编辑工具在后台维护。
2.3、控制流
当一个动作或活动结点结束执行时,控制流将马上传递到下一个动作或活动结点。可以用流箭头来说明这个流,显示从一个动作或活动结点到下一个动作或活动结点的控制路径。如下图所示,UML中用一条从前一动作指向后续动作不带事件标签的简单箭头表示一个流。
事实上,控制流会从某个地方开始,然后在某个地方结束(除非它是一个只有开始没有结束的无穷的流)。 可以用特殊的符号说明控制流的初始(一个实心圆)和结束(一个圆圈内的实心圆)。
2.4、分支
用一个菱形来表示分支。
一个分支可以有一个进入流和两个或多个离去流。在每个离去流上放置一个布尔表达式,在进入这个分支时被判断一次。
在所有这些离去流中,其监护条件不应该重叠(否则,控制流会有二义性),但是它们应该覆盖所有的可能性(否则,控制流可能会冻结)。
使用关键字else来标记一个离去转移,它表示如果其他的监护表达式都不为真时所执行的路径。
当两个控制路径重新合并时,也可以用带有两个输入箭头和一个输出箭头的菱形符号来表示。对于合并来说,无需监护条件。
为了获得迭代的效应,可以用一个动作设置迭代器的值,用另一个动作增加该迭代器的值,并用一个分支来判断该迭代是否结束。虽然UML提供了用于循环的结点类型,但是通常用文字比用图能更容易地表达这些。
2.5、分岔和汇合
在UML中,用同步棒来说明这些并行控制流的分岔和汇合。
一个同步棒是一条水平或垂直粗线。
并发控制流经常存在于独立的主动对象的语境中,而主动对象通常被建模为一个进程或线程。
分叉和汇合 常用于主动类、主动对象的进程、线程中。
分岔表示把一个单独的控制流分成两个或更多的并发控制流。一个分岔可以有一个进入转移和两个或更多的离去转移,每一个离去转移表示一个独立的控制流。在这个分岔之下,与每一个路径相关的活动将并行地继续。从概念上说,这些流中的每一个流的活动都是真实地并行的,尽管在一个运行系统中,这些流既可以是真实并发的(当系统被部署在多个结点上的情况下),也可以是顺序但交替的(在系统只部署在一个结点上的情况下),因此只给出真实并发的图示。
一个汇合表示两个或更多的并发控制流的同步。一个汇合可以有两个或多个进入转移和一个离去转移。在这个汇合上面,与每一个路径相关的活动并行地执行。在汇合处,并发的流取得同步,这意味着每个流都等待着,直到所有进入流都到达这个汇合处,然后,在这个汇合的下面,只有一个控制流从这一点继续执行。
汇合和分岔应该是平衡的,即离开一个分岔的流的数目应该和进入与它对应的汇合的流的数目相匹配。
2.6、泳道
将一个活动图中的活动状态分组,每一组表示负责那些活动的业务机构。每个组被称为一个泳道,因为从视觉上,每组用一条垂直的实线把它与邻居分开
一个泳道说明一组共享某个机构特性的活动,每个泳道在图中都有一个唯一的名称。泳道可能代表现实世界的某些实体。
每个泳道表示一个活动图的全部活动中部分活动的高层职责,并且每个泳道最终可能由一个或多个类实施。在一个被划分为泳道的活动图中,每个活动严格地属于一个泳道,而转移可以跨越泳道。
2.7、对象流
对象可以被包含在与一个活动图相关的控制流中。把这些对象放置在活动图中,并用箭头将它们连接到产生或使用这些对象的活动上。
因为它描述了一个对象值从一个动作流向另一个动作。对象流本质上意味着控制流(没有对象值,就无法执行一个需要该对象值的动作),因而无需在由对象流连接的动作之间再画出控制流。
上图中Process order将创建一个Order对象,Ship order将把Order对象的状态变为filled。
显示对象状态是如何改变,通过在对象名下面的方括号中命名它的状态来表示对象的状态。
2.8、扩展区域
扩展区域表示在元素列表或集合上执行的活动模型片断。在活动图中,围绕着一个区域画一条虚线来表示扩展区域。
区域的输入和输出都是值的集合
上图在图的主体中,接收了一个订单。这样就产生了一个类型为Order的值,该值包含了一个类型为LineItem的数组。Order值是向扩展区域的输入。扩展区域的每次执行都作用于 Order 集合中的一个元素。
在区域内部输入值的类型对应于Order 数组的一个元素,即LineItem。
扩展区域活动分岔到两个动作:一个动作找到 Product(产品)并将它加到送货队列;另一个动作计算货物的价格。没有必要按顺序处理 LineItems,扩展区域的不同执行可以并发进行。当扩展区域中所有的执行都结束时,货物被放入 Shipment(Products 的集合),价格也被放入 Bill(Money值的集合)。值Shipment是动作ShipOrder 的输入,而值Bill 是动作SendBill的输入。
3、一般用法
3.1、对工作流建模
建立过程:
为工作流建立一个焦点。除非很小的系统,否则不可能在一张图中显示所有感兴趣的工作流。
选择对总体工作流中的各个部分具有高层职责的业务对象。这些业务对象可以是系统词汇中的真实事物,也可能较为抽象。无论哪种情况,为每个重要的业务对象或组织建立一个泳道。
识别该工作流初始状态的前置条件和该工作流终止状态的后置条件。这对于帮助对工作流的边界建模是重要的。
从该工作流的初始状态开始,说明随着时间发生的动作,并在活动图中表示它们。
将复杂的动作或多次出现的动作集分解到一个单独活动图中来调用。
找出连接这些动作和活动结点的流。首先从工作流的顺序流开始,然后考虑分支,接着再考虑分岔和汇合。
如果工作流中涉及重要的对象,则把它们也加入到活动图中。如果对表达对象流的意图是必要的,则显示其变化的值和状态。
上图显示了一个零售业务的活动图,它所说明的是当一个顾客从邮件订单中返回一个项目时的工作流。工作从顾客对象Customer的动作Request return开始,然后通过Telesales(Get return number),回到 Customer(Ship item),然后到仓库对象Warehouse(先到Receive item,后到Restock item),最后,以会计对象Accounting的Credit account结束。如图20-10所示,一个重要对象(Item的一个实例)也在过程中流动,并且从returned状态变化到available状态。
3.2、对操作建模
建立过程:
收集这个操作所涉及的抽象。包括操作的参数(及其返回类型,如果有)、所属类的属性以及某些邻近的类。
识别该操作的初始状态的前置条件和终止状态的后置条件,也要识别操作所属的类在操作执行期间必须保持的不变式。
从该操作的初始状态开始,说明随着时间发生的活动和动作,并在活动图中将它们表示为活动状态或者动作状态。
如果需要,使用分支来说明条件路径和迭代。
仅当这个操作属于一个主动类时,才在必要时用分岔和汇合来说明并行的控制流。
上图显示了一个在类Line的语境中描述操作intersection的算法的活动图,它的特征标记包含一个参数(line,属于类Line)和一个返回值(属于类Point)。类Line有两个关注的属性:slope(线段斜率)和delta(线段相对原点的偏移量)。
这个操作的算法很简单,如下面的活动图所示。首先,检测当前线段的斜率slope是否和参数line的slope相同。如果相同,线段不交叉,并返回一点Point(0,0)。否则,操作首先计算交叉点的x值,然后计算y值,x和y都是操作的局部对象。最后,返回一个点Point(x,y)。