zoukankan      html  css  js  c++  java
  • Python设计模式

    简介

    状态图主要用于描述对象在其生命周期中各种状态、状态之间的转换过程、触发状态转换的各种事件(条件)及执行的动作。

    状态图构建步骤

        - 找出适合用状态图描述的类、确定类中需要做状态图的重要对象

        - 确定重要对象的主要状态、状态之间的转换事件、条件、动作、初次态等

        - 细化状态之间的复杂转换和详细事件

        - 精化复合状态、并发区域等

    状态图与状态机

    状态图的基础是状态机,熟悉状态图之前需要对状态机有大致的了解。

    状态机是有限状态机的简称,可以用来模拟世界上的大部分事物。简单地说,状态机有三个特性、四个要素

    • 工作原理:发生事件(Event)后,根据当前状态(Current State)决定执行的动作(Action),并设置下一个状态(Next State)。以进程调度为例:

        

    • 三个特性

          - 有限状态机的状态(State)总数是有限的

          - 状态机任一时刻只处于一种状态之中

          - 在特定的条件(也称事件Event)被满足时,状态机会执行相应的动作(Action)从一种状态转换(Transition)到另一个状态

    • 四个要素

          - 现态:当前所处状态

          - 条件:又称为事件(Event),当一个条件被满足时就会触发一个动作,引起状态的一次转换

          - 动作:条件满足后触发的动作

          - 次态:满足某种条件触发了相应动作后所转换到的新状态,"次态"和"现态"的概念都是相对的,状态转移后"次态"就变成了"现态"

    状态图主要元素

    • 状态(States):表示对象在其生命周期中的某个阶段、条件或状况,包括状态名、内外部转换、进入退出动作等。用圆角矩形标识

          

        - 内部结构:状态的内部结构可以由以下部分组成,除状态名外其他都是可选的,根据实际情况而定

                - 状态名(State Name): 状态名称

             - 进入/退出动作(Entry/Exit Action): 进入和退出动作

             - 内部转移(Internal Transition): 不会发生状态的转移

             - 内部动作(Do Action): 状态保持不变时执行的动作

             - 子状态(Submachine State): 适用于复合状态场景

             - 延迟事件(Deferred Event): 在本状态下暂时不处理,但不被丢弃,而是延迟到其他状态中处理的事件

        - 初始状态(Initial States):用实心圆点标识

          

        - 结束状态(Final States):用圆形内嵌圆点标识,一个状态图可以由多个结束状态。

          

        - 复合状态(Compound States):一个状态可以被嵌套在另一个状态之中,被嵌套的状态叫子状态,包含子状态的状态就称为复合状态,以两种形式出现:

              - 顺序复合状态:复合状态中的所有子状态都是互斥的不能同时存在,且在对象生命周期中的任一时刻只能处于一个子状态

               

              - 并发复合状态:复合状态中有两个或多个可以并发执行的子状态

                 

        - 历史状态(History States):复合状态场景中记住退出时的子状态,下次可以直接越过外层状态直接进入子状态

              - 浅历史状态(Shallow History State):只记住复合状态最外层的历史。用标识

                 

                 

              - 深历史状态(Deep History State):记住复合状态所有层次子状态的历史。用标识

                 

    • 动作(Actions):可执行的原子级操作。用正斜杠后间隔的文字标识

     

    • 事件(Event):事件可以分成调用事件、变化事件、时间事件和信号事件等

          

        - UML表示法

          

        - 事件分类:事件按传送范围分为外部事件和内部事件,按事件源类型分为调用、变化、时间、信号、延迟事件等类型。

              - 按传送范围分

                - 外部事件:系统与外部参与者之间传送的事件

                - 内部事件:系统内部各对象之间传送的事件

             - 按事件源类型分

                - 调用事件(Call Event):对象对调用操作的接收

                - 变化事件(Change Event):依赖于指定属性值的布尔表达式条件发生改变的事件

                - 时间事件(Time Event):计算时间的表达式条件被满足的事件

                - 信号事件(Singal Event):两个对象之间进行通信的规范和载体

                - 延迟事件(Deferred Event): 在本状态下暂时不处理,但不被丢弃,而是延迟到其他状态中处理的事件

    • 转换(Transitions):状态之间在某个事件或条件驱动下的切换过程。用状态之间带文字描述的有向箭头线标识,根据外部、内部、进入、退出转换的区别而不同。

         

          - 状态转换五要素

              - 初态:转换前的状态

              - 触发事件:转换的触发条件

              - 警备条件(Guard Condition):布尔表达式,决定是否激活转换。不是所有的事件都会引起状态的转移,比如关机事件在开机状态下才会激活

              - 动作:转换激活时的操作

              - 次态:转换后的状态

            

          - 自身转移(Self-Transitions):状态有返回自身状态的转移

             

          - 复杂转换:

              - 外部转换:对事件(Event)做出响应,执行相应的动作(Action),引起状态(State)变化。格式:事件(参数)[警备条件]/动作

              - 内部转换:对事件(Event)做出响应,执行相应的动作(Action),但并不引起状态(State)变化。格式:事件(参数)[警备条件]/动作

                    用单向弧形箭头标识

              - 进入转换:当进入某个状态(State)时执行某个动作(Action)。格式:entry/动作

              - 退出转换:当退出某个状态(State)时执行某个动作(Action)。格式:exit/动作

    • 进入节点(Enter Point):忽略初始化过程,直接通过一个节点进入状态的情况

         

    • 退出节点(Exit Point):直接通过一个节点退出状态的情况

         

    • 并发区域(Concurrency Regions):一个复合状态中有两个或两个以上并行执行的子状态机,并发子状态机覆盖的流程称为并发区域。

        并发区域中可能没有初始状态、技术状态,其中每个子状态机还可以进一步分解为顺序组成状态。

        

    状态图示例

    以线程调度及状态转换为例

     

    状态图与活动图的区别

         - 描述对象:状态图是描述对象的状态转换,面向对象;活动图是描述执行系统中用例的具体步骤,面向过程

         - 侧重点:状态图的重点是对象的各个状态机状态之间的转换事件、条件、动作等;活动图的重点是对象行为遵循的规则   

         - 触发事件:状态图中的状态转换需要触发事件及满足相应的警备条件;活动图中的状态转换是自动顺序执行的,无需触发事件

         - 对象范围:状态图中的状态转换通常只是一个对象内部的状态变迁;活动图中的状态转换可以用不同的泳道(对应于不同的对象)划分

    状态图注意事项

        

        - 不必为类中的每个对象都创建状态图,只为那些比较复杂的、状态比较多的对象创建状态图

        - 并不是所有的事件都会引起状态的转换,如内部转换

        - 转换在满足警备条件是才会响应事件

        - 复杂状态图可以在总状态图中隐藏子状态细节,并且单独的子状态图展示相应的细节

        - 根据实际需要适当使用复合状态、并发区域

  • 相关阅读:
    如何为Android写一个PhoneGap插件
    Javascript高性能动画与页面渲染
    jquery mobile Popup
    android学习资料免费下载
    锋利的jquery第2版高清 pdf
    android获取sd卡最后一张照片
    mongodb 基础
    django 实现读写分离
    docker 部署django方式
    mysql 主从读写
  • 原文地址:https://www.cnblogs.com/coolstream/p/9572855.html
Copyright © 2011-2022 走看看