5-行为图
5.1 活动图
4.1.1 活动图的概念
行为系统的动态方面建模的5个图之一.它主要是一个流图,描述从活动到活动的流。
活动是在状态机中进行的一个非原子的执行,它由一系列的动作组成。
动作是由可执行的不可分的计算组成,这些计算引起系统的状态发生变化或返回一个值。
活动图区别于其它动态建模图(非常重要)
- 交互作用图强调从对象到对象的控制流;
- 时序图强调消息的时间顺序;
- 协作图强调交互作用的对象的结构关系;
- 交互作用图着眼于传递消息的对象,活动图则着眼于在对象间传递的操作;
- 活动图根据对象状态的变化来确定动作与动作的结果。在活动图中,一个动作结束后自动进入下一个动作;而在状态图中,状态的跃迁可能需要事件的触发。
组成元素(重要)
- 活动状态或动作状态;
- 跃迁;
- 对象;
活动图与状态机
活动图是一种特殊的状态机,大部分的状态都是活动状态,大部分跃迁都是由源状态活动的完成类触发的。
活动图示例
4.1.2 活动图图符(重要:区分动作与活动状态)
- 动作状态
可执行的、不可分的计算,代表动作的执行.如为属性赋值、调用一个对象的操作、发送一个信号给一个对象等。
动作状态不能被分解,即事件可以发生,但动作状态的工作没有被打断。
完成动作状态中的工作花费相当短的执行时间。
- 活动状态
非原子的,可以分解,可以被打断,通常需要一段时间才能完成。
动作状态可看作活动状态的特例,活动状态可看作一个组合,由其他活动状态和动作状态构成。
活动状态可以有入口、出口动作和子状态机的规定。
- 跃迁
用来表示从一个动作或活动状态传递到下一个动作或活动状态的路径。
一项操作可以描述为一系列相关活动。一个活动仅一个起始点,但可有多个结束点。
判断标志可以有多个输入和输出跃迁,但在活动的运作中仅触发一个满足条件的跃迁。
- 分支
规定了基于布尔表达式的替换路径。
分支起始于判定,有一个输入,两个或多个输出。每个输出跃迁上的布尔表达式为真时,跃迁触发。所有护卫条件不重复,且能覆盖所有的可能性。
分支迭代:用一个活动状态来设置迭代因子的初始化值,另一个活动状态来增加迭代因子的值,用一个分支来判断迭代是否结束。
- 分叉和汇合
UML中使用同步条来规定并行控制流的分叉和联结。
同步条是一条粗的水平线或垂直线。
分叉表示将单一的控制流分为两个或多个并发的控制流。分叉有一个输入跃迁和多个输出跃迁,每个输出代表一个独立的控制流。
在分叉下面,与每个输出路径相关的活动是并行进行的。
并发分为真正并发(多CPU)和交叉并发(单CPU)。
代表了两个或多个并发控制流的同步,联结有多个输入跃迁和一个输出跃迁。
联结以上,与各路径有关的活动是并行的。在联结处,并发的流同步,所有的输入流到达同步流后,同步条将多个输入控制流合并,输出一个控制流,进而执行后面的活动。
分叉和汇合是平衡的,即离开分叉的控制流的数目应该与进入相应汇合的控制流数目相等。并行控制流的活动可以通过发送信号来彼此通信。
- 泳道
泳道说明活动由谁来完成,将活动图的逻辑描述与顺序图、合作图的责任描述结合起来。
泳道用矩形框来表示,属于某个泳道的活动置于该矩形框中,将对象名置于举行框的顶部,表示泳道中的活动由该对象负责。
前两活动图中皆含两个泳道。
- 对象流
与活动图有关的控制流可能涉及到对象。可将对象置于活动图中,用依赖关系将对象和产生、修改或破坏该对象的活动或跃迁连接。依赖关系和对象的使用称为对象流。
活动图除可说明对象流,还可说明对象的角色、状态和属性值的变化。
活动图示例
画活动图的步骤(重要)
- 识别要对其工作流描述的类
- 对动态状态建模
- 对动作流建模
- 对对象流建模
与流程图的区别(重要)
- 流程图着重描述处理过程,而活动图描述的是对象活动的顺序关系所遵循的规则,着重表现的是系统的行为。
- 活动图能表示并发活动的情形,而流程图不能。
- 活动图是面向对象的,而流程图是面向过程的。
4.1.3 活动图应用(重要)
- 为工作流建模
- 为操作建模
- JAVA代码建模
工作流
工作流常用于可视化、规范、构建和文档化系统的商业过程。
为工作流建模
- 确定工作流的中心。针对复杂系统建模。
- 选择与工作流有关的商业对象。为每个对象创建一个泳道。
- 识别工作流初始状态的前置条件和工作流最终状态的后置条件。
- 从工作流的初始状态开始,规定随时间发生的活动和动作,置于活动图中。
- 对于复杂动作或多次出现的动作集合,可将它们折叠为活动状态,再提供一个单独的活动图来展开活动状态。活动图的粗细粒度
- 用跃迁连接活动状态和动作状态,从工作流中的顺序流开始,后考虑分支,再考虑分叉和联结。
- 工作流涉及的对象,置于活动图中。
为操作建模
- 收集与操作有关的抽象,如参数、返回值、相关类属性等。
- 识别工作流初始状态的前置条件和工作流最终状态的后置条件,还要识别出在操作执行过程中必须持有的操作所在类的不变量。
- 从工作流的初始状态开始,规定随时间发生的活动和动作,置于活动图中。
- 必要时使用分支、分叉和联结。
为代码建模
可用活动图为每个操作流程建模,实际中少用,因代码更易理解。只有当操作行为复杂,代码难以阅读时,才用活动图为操作建模。
Java代码示例
Public void handleThread(int state){
for(int i = 0; i < controls.length; i++) {
if(state == CustomControlsContext.START){
if(controls[i].instanceofCustomControls){
((CustomControls)controls[i].start();
}
}else if(state == CustomControlsContext.STOP){
if(controls[i].instanceofCustomControls){
((CustomControls)controls[i].stop();
}
}
}
}
5.2 状态图
4.2.1 状态、跃迁、判定、同步条、活动
状态(重要:状态机)
状态机(State Machine)描述了对象在生命周期中响应事件所经历的状态的序列以及对象对这些事件的响应。它由状态、跃迁、事件、活动、动作等组成。状态表示对象在生命周期中的一个条件或状况。
状态的组成(重要:内部跃迁)
- 名字:用以区分不同的状态;
- 入口/出口动作:进入和退出状态时执行动作;
- 内部跃迁:不引起状态变化的跃迁,不同于自跃迁,不离开状态,不执行出口和入口动作;
- 子状态:被嵌套的状态,包括不相交子状态和并发子状态;’
- 不含子结构的状态称为简单状态(Simple State),含子状态的状态称为组合状态(Composite State)。
- 不相交子状态:也称为顺序子状态(Sequential Substates)。
- 延迟事件(Deferred Events):在当前状态不处理,推迟到不再被推迟时处理,它的实现需要存在一个内部的事件队列。通过将事件与defer绑定来延迟事件。
7.初始状态(Initial State)和最终状态(Final State)两种特殊的状态,表示状态机的开始和结束。
顺序子状态
组合状态Purchasing中的子状态
历史状态
历史状态使得含有顺序子状态的组合状态能记住离开给组合状态前的最后一个活动子状态,用带圈的“H”表示。
如子状态进入最终状态,它丢失它存储的历史,就好象状态机一次也未进入一样。
并发子状态
跃迁(重要)
两个状态间的一种关系。对象在一种状态执行动作、发生事件或满足条件时,跳转到另一状态。它是从活动(或动作)到活动(或动作)的控制流的传递。
跃迁分为内部跃迁和外部跃迁,外部跃迁是最为普通的跃迁,会发生状态的变化,内部跃迁不会发生状态的变化.
跃迁的组成
- 源状态与目标状态:跃迁触发前,对象处于源状态,触发后对象处于目标状态。
- 触发事件:事件是可以触发状态跃迁的激励的发生。跃迁图中的addStudent就是触发事件。完成跃迁(活动结束)属于非触发跃迁。源状态与目标状态相同的跃迁是自跃迁。跃迁可以有多个源状态或目标状态。
- 护卫条件:一个布尔表达式,用“[]”括起,放在触发时间后面,当触发事件后判断表达式为“真”执行跃迁,否则不执行。
- 动作:一个可执行的原子计算。它可以包括方法的调用、另一个对象的创建或销毁、给对象发送一个信号等动作。跃迁图中的sum=sum+1就是动作。动作是原子的,完成前不能被打断,这点不同于活动。
判定(Decision)
代表活动图或状态图的一个特殊位置,工作流在这个问题根据护卫条件分支。
同步条(Synchronization Bars)
定义活动图中的分叉(Forks)和联结(Joins)。
活动(Activity)
活动是状态机中进行的一个非原子的执行,由一系列的动作组成。可以将动作看作是特殊的活动,即不能再细分的活动。
4.2.2 状态图
为系统的动态方面建模的5个图之一。它主要是一个流图,描述从状态到状态的流,包括一个特定对象的所有可能状态以及引起状态跃迁的事件。活动图是状态图的特例。
状态图是为一个对象的生命期间的情况建立模型,着重描述从一个状态到另一个状态的流程,主要是外部事件的参与。
相关概念
- 状态图:给出一状态机,强调从状态到状态的控制流;
- 状态机:规定对象在生命周期中响应事件所经历的状态的序列以及对象对这些事件的响应;
- 状态:对象在生命周期中的一种条件或状况;
- 事件:重要发生事件的规范,在时空域中有一个位置;
- 跃迁:两个状态间的关系;
- 活动:状态机中正在执行的可分的执行;
- 动作:可执行的、不可分的计算;
画图步骤
- 识别一个对其生命周期进行描述的参与行为的类
- 对对象建模,即确定对象可能存在的状态
- 对事件建模,即确定对象可能存在的事件
- 对动作建模,即确定当转变被激活是,相应被执行的动作
状态
- 初始状态(1个)
- 最终状态(1个或多个)
- 中间状态
- 复合状态
跃迁
带箭头的连线,连接不同状态。跃迁由事件触发,应在其上标出事件表达式。无事件表达式表示源状态内部活动完成后自动触发跃迁
与其他图区别(重要)
- 交互作用图描述多个对象间的交互作用;
- 活动图描述从活动到活动的控制流;
- 状态图描述单个对象在它的整个生命周期的行为,为从事件到事件的控制流。
状态图示例
机房收费系统登录的状态图
4.2.3 状态图应用
通常用来描述事件驱动对象的行为。主要规定对象稳定状态、跃迁触发事件、状态变化发生的动作。
为事件驱动对象建模
- 选择状态机的上下文,上下文可以是一个类、用例、子系统或系统整体;
- 为对象选择初始状态和最终状态;
- 考虑对象存在一段时间的条件,确定对象的稳定状态;
- 确定稳定状态在对象生命周期中的局部排序;
- 确定触发从状态到状态跃迁的事件;
- 确定状态变化的动作;
- 通过使用子状态、分支、历史状态等来简化状态机;
- 确定是否所有的状态都在事件的某个组合中可达;
- 确定没有状态是死端,死端即没有事件组合可以使对象从这个状态中跃出;
- 检查状态机是否违反预想的事件顺序和响应。
示例
Java代码与对应状态图
int sum = 0;
public int register(Student s){
switch(state){
case Open:
if(sum > 40){
state = Open;
sum = sum + 1;
}else
state = Close;
break;
case Close:
System.out.println(“the class is full”);
}
return sum;
}
活动图随堂测试
仔细分析下面对某公司“会见顾客”业务流程的描述,画出带泳道的活动图。
(1)公司业务员打电话给客户,确定一个会面。
(2)如果会面地点在公司内,公司技术人员需要为会面准备一间会议室,同时,咨询顾问需要为准备一份陈述报告。
(3)如果会面地点在公司外,则只需咨询顾问需要为准备一份陈述报告。
(4)咨询顾问与顾客在约定的时间和地点见面。
(5)业务员随后为他们准备好会议用纸。
(6)如果会面得到了一个解决方案,则咨询顾问根据解决方案编写一个报告,并将报告发给顾客。