在描述有限状态机时,状态、事件、转换和动作是经常会碰到的几个基本概念。 
状态(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;
   }
  
  }  |