科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道为Linux应用构造有限状态机方法(上) (2)

为Linux应用构造有限状态机方法(上) (2)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

在描述有限状态机时,状态、事件、转换和动作是经常会碰到的几个基本概念。

作者:shenhuo 来源:赛迪网技术社区 2007年10月20日

关键字: 操作系统 方法 状态机 Linux

  • 评论
  • 分享微博
  • 分享邮件
 

在描述有限状态机时,状态、事件、转换和动作是经常会碰到的几个基本概念。

状态(State) 指的是对象在其生命周期中的一种状况,处于某个特定状态中的对象必然会满足某些条件、执行某些动作或者是等待某些事件。"

事件(Event) 指的是在时间和空间上占有一定位置,并且对状态机来讲是有意义的那些事情。事件通常会引起状态的变迁,促使状态机从一种状态切换到另一种状态。

转换(Transition) 指的是两个状态之间的一种关系,表明对象将在第一个状态中执行一定的动作,并将在某个事件发生同时某个特定条件满足时进入第二个状态。

动作(Action) 指的是状态机中可以执行的那些原子操作,所谓原子操作指的是它们在运行的过程中不能被其他消息所中断,必须一直执行下去。

二、手工编写状态机

与其他常用的设计模式有所不同,程序员想要在自己的软件系统中加入状态机时,必须再额外编写一部分用于逻辑控制的代码,如果系统足够复杂的话,这部分代码实现和维护起来还是相当困难的。在实现有限状态机时,使用switch语句是最简单也是最直接的一种方式,其基本思路是为状态机中的每一种状态都设置一个case分支,专门用于对该状态进行控制。下面的代码示范了如何运用switch语句,来实现图1中所示的状态机:

  
  switch (state) {
  
   // 处理状态Opened的分支
   case (Opened): {
    // 执行动作Open
    open();
    // 检查是否有CloseDoor事件
    if (closeDoor()) { 
     // 当前状态转换为Closed
     changeState(Closed)
    }
    break;
   }
  
   // 处理状态Closed的分支
   case (Closed): {
    // 执行动作Close
    close();
    // 检查是否有OpenDoor事件
    if (openDoor()) {
     // 当前状态转换为Opened
     changeState(Opened);
    }
    // 检查是否有LockDoor事件
    if (lockDoor()) {
     // 当前状态转换为Locked
     changeState(Locked);
    }
    break;
   }
  
   // 处理状态Locked的分支
   case (Locked): {
    // 执行动作Lock
    lock();
    // 检查是否有UnlockDoor事件
    if (unlockDoor()) {
     // 当前状态转换为Unlocked
     changeState(Unlocked);
    }
    break;
   }
  
   // 处理状态Unlocked的分支
   case (Unlocked): {
    // 执行动作Unlock
    unlock();
    // 检查是否有LockDoor事件
    if (lockDoor()) {
     // 当前状态转换为Locked  
     changeState(Locked)
    }
    // 检查是否有OpenDoor事件  
    if (openDoor()) {
     // 当前状态转换为Opened
     changeSate(Opened);
    }
    break;
   }
  
  }
 
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章