OOAD - 动态建模

动态模型代表系统的时间相关方面。 它涉及系统中对象状态的时间变化。 主要概念是 −

  • 状态,即对象生命周期内特定条件下的情况。

  • 转变,状态的改变

  • 事件,触发转换的事件

  • 操作,由于某些事件而发生的不间断的原子计算,以及

  • 转换的并发性。

状态机对对象的行为进行建模,因为对象在其生命周期中由于某些事件而经历多个状态,以及由于事件而发生的操作。 状态机通过状态转换图以图形方式表示。

状态和状态转换

状态

状态是由对象在特定时间段所具有的属性值给出的抽象。 它是在对象生命周期的有限时间内发生的情况,其中对象满足某些条件、执行某些活动或等待某些事件发生。 在状态转换图中,状态由圆角矩形表示。

状态的组成部分

  • 姓名 − 字符串将一种状态与另一种状态区分开来。 一个状态可能没有任何名称。

  • 进入/退出操作 − 它表示进入和退出状态时执行的活动。

  • 内部转换 − 状态内的变化不会导致状态发生变化。

  • 子状态 − 状态内的状态。

初始状态和最终状态

对象的默认起始状态称为初始状态。 最终状态表示状态机执行完成。 初始状态和最终状态是伪状态,并且除了名称之外可能不具有常规状态的部分。 在状态转换图中,初始状态由实心黑色圆圈表示。 最终状态由一个实心黑色圆圈包围在另一个未填充黑色圆圈内表示。

转换

转换表示对象状态的变化。 如果事件发生时对象处于某种状态,则该对象可以根据指定条件执行某些活动并改变状态。 在这种情况下,就说发生了状态转换。 转换给出了第一个状态和新状态之间的关系。 转换以图形方式表示为从源状态到目标状态的实心有向弧。

转换的五个部分是 −

  • 源状态 − 受转换影响的状态。

  • 事件触发器 − 如果满足保护条件,则源状态中的对象会发生转换。

  • 触发条件 − 布尔表达式,如果为 True,则在接收事件触发器时导致转换。

  • 动作 − 由于某些事件而在源对象上发生的不可中断的原子计算。

  • 目标状态 − 转换完成后的目标状态。

示例

假设一个人从地点 X 乘坐出租车到地点 Y。 该人的状态可能是:等待(等待出租车)、乘坐(他已经打到出租车并正在乘坐)和到达(他已到达目的地)。 下图描述了状态转换。

转换

事件

事件是一些可以触发一个对象或一组对象的状态转换的事件。 事件在时间和空间上有一个位置,但没有与之相关的时间段。 事件通常与某些操作相关联。

事件的示例有鼠标单击、按键、中断、堆栈溢出等。

触发转换的事件写在状态图中的转换弧旁边。

示例

考虑到上图所示的示例,当该人打到出租车时,就会发生从等待状态到骑行状态的转换。 同样,当他到达目的地时,就达到了最终状态。 这两个事件可称为事件 Get_Taxi 和 Reach_Destination。 下图显示了状态机中的事件。

过渡事件

外部和内部事件

外部事件是从系统用户传递到系统内对象的事件。 例如,用户单击鼠标或按下按键都是外部事件。

内部事件是指在系统内从一个对象传递到另一个对象的事件。 例如,堆栈溢出、除法错误等。

推迟的事件

延迟事件是那些当前状态下的对象不会立即处理的事件,而是排列在队列中,以便稍后可以由处于其他状态的对象处理的事件。

事件类

事件类表示一组具有共同结构和行为的事件。 与对象类一样,事件类也可以按层次结构进行组织。 事件类可以具有与其关联的属性,时间是隐式属性。 例如,我们可以考虑航空公司航班起飞的事件,我们可以将其分为以下几类 −

航班出发(航班号、出发城市、目的地城市、航线)

操作

Activity(活动)

活动是对对象状态的操作,需要一定的时间段。 它们是系统内正在进行的、可以中断的执行。 活动显示在活动图中,描绘了从一项活动到另一项活动的流程。

Action(操作)

操作是由于某些事件而执行的原子操作。 原子性意味着动作是不可中断的,即,如果动作开始执行,它就会完成而不会被任何事件中断。 动作可以对已触发事件的对象或对该对象可见的其他对象进行操作。 一组操作构成一项活动。

进入和退出操作

进入操作是在进入状态时执行的操作,与导致该状态的转换无关。

同样,离开状态时执行的操作(无论导致退出该状态的转换如何)都称为退出操作。

场景

场景是对指定操作序列的描述。 它描述了经历一系列特定动作的对象的行为。 主要场景描述了基本序列,次要场景描述了替代序列。

动态建模图

有两个主要图表用于动态建模 −

交互图

交互图描述了不同对象之间的动态行为。 它由一组对象、它们的关系以及对象发送和接收的消息组成。 因此,交互对一组相互关联的对象的行为进行建模。 两种类型的交互图是 −

  • 序列图 − 它以表格方式表示消息的时间顺序。

  • 协作图 − 它表示通过顶点和弧发送和接收消息的对象的结构组织。

状态转换图

状态转换图或状态机描述单个对象的动态行为。 它说明了对象在其生命周期中经历的状态序列、状态的转换、导致转换的事件和条件以及事件引起的响应。

事件并发

在一个系统中,可能存在两种类型的并发。 他们是 −

系统并发

这里,并发是在系统级别建模的。 整个系统被建模为状态机的聚合,其中每个状态机与其他状态机同时执行。

对象内的并发

在这里,对象可以发出并发事件。 一个对象可能具有由子状态组成的状态,并且每个子状态中可能会发生并发事件。

对象内并发相关的概念如下 −

简单状态和复合状态

简单状态没有子结构。 嵌套有更简单状态的状态称为复合状态。 子状态是嵌套在另一个状态内的状态。 它通常用于降低状态机的复杂性。 子状态可以嵌套到任意数量的级别。

复合状态可能具有顺序子状态或并发子状态。

顺序子状态

在顺序子状态中,执行控制以顺序方式从一个子状态一个接一个地传递到另一个子状态。 这些状态机最多有一个初始状态和一个最终状态。

下图说明了顺序子状态的概念。

顺序子状态

并发子状态

在并发子状态中,子状态并行执行,或者换句话说,每个状态内部都有并发执行的状态机。 每个状态机都有自己的初始状态和最终状态。 如果一个并发子状态先于另一个子状态到达其最终状态,则控制将在其最终状态等待。 当所有嵌套状态机到达其最终状态时,子状态将连接回单个流程。

下图展示了并发子状态的概念。

并发子状态