有限状态自动机FSM实现(二)--State模式

基于switch结构的有限状态自动机的实现已经在前一篇博文中给出,请猛击

State模式适用于如下情况:

1)一个对象的行为取决于它的状态,并且必须在运行时根据状态改变它的行为。

2)一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。

State模式包含如下对象:

Context对象

1)定义客户感兴趣的接口。

2)维护一个State子类的实例,这个实例定义当前状态。

State状态对象

定义一个接口封装与Context的一个特定状态相关的行为。

以下图为例:TCPConnection对象即Context对象, TCPState对象即State状态对象。

下面是门的有限状态自动机对应的结构图:

源代码如下:

//fsm.h

#pragma  once
#include <string>
using namespace std;

enum DoorEvent
{
	EVENT_UNKOWN		   =   0,
	EVENT_OPEN_DOOR        =   1,
	EVENT_CLOSE_DOOR       =   2,
	EVENT_LOCK_DOOR        =   3,
	EVENT_UNLOCK_DOOR      =   4
};

class Context;

class State
{
public:
	State(string stateStr="STATE_UNKOWN"):m_stateStr(stateStr){}
	virtual ~State(){}
	string getStateStr(){return m_stateStr;}

	virtual void Handle(Context* pContext, DoorEvent event) = 0;

protected:
	string m_stateStr;
};

class  StateOpened : public State
{
public:
	StateOpened() : State("STATE_OPENED"){}

	void Handle(Context* pContext, DoorEvent event);
};

class StateClosed: public State
{
public:
	StateClosed():State("STATE_CLOSED"){}

	void Handle(Context* pContext, DoorEvent event);
};

class StateLocked: public State
{
public:
	StateLocked() : State("STATE_LOCKED"){}

	void Handle(Context* pContext, DoorEvent event);
};

class StateUnlocked: public State
{
public:
	StateUnlocked() : State("STATE_UNLOCKED"){}

	void Handle(Context* pContext, DoorEvent event);
};

class Context
{
public:
	Context(State* pState){m_state = pState;}
	~Context(){}
	void Request(DoorEvent event){m_state->Handle(this, event);}
	void ChangeState(State *pState){m_state = pState;}
	string getStateStr(void){return m_state->getStateStr();}

private:
	State *m_state;
};

//fsm.cpp

#include <iostream>
#include <iomanip>
using namespace std;
#include "fsm.h"
#include <Windows.h>

const char *DoorEventStr[] =
{
	"EVENT_UNKOWN",
	"EVENT_OPEN_DOOR",
	"EVENT_CLOSE_DOOR",
	"EVENT_LOCK_DOOR",
	"EVENT_UNLOCK_DOOR"
};

void StateOpened::Handle(Context* pContext, DoorEvent event)
{
	switch(event)
	{
	case EVENT_CLOSE_DOOR:
		pContext->ChangeState(new StateClosed);
		break;

	default:
		break;
	}
}

void StateClosed::Handle(Context* pContext, DoorEvent event)
{
	switch(event)
	{
	case EVENT_LOCK_DOOR:
		pContext->ChangeState(new StateLocked);
		break;

	case EVENT_OPEN_DOOR:
		pContext->ChangeState(new StateOpened);
		break;

	default:
		break;
	}
}

void StateLocked::Handle(Context* pContext, DoorEvent event)
{
	switch(event)
	{
	case EVENT_UNLOCK_DOOR:
		pContext->ChangeState(new StateUnlocked);
		break;

	default:
		break;
	}
}

void StateUnlocked::Handle(Context* pContext, DoorEvent event)
{
	switch(event)
	{
	case EVENT_OPEN_DOOR:
		pContext->ChangeState(new StateOpened);
		break;

	case EVENT_LOCK_DOOR:
		pContext->ChangeState(new StateLocked);
		break;

	default:
		break;
	}
}	

int main(int argc, char* argv[])
{
	DoorEvent event = EVENT_UNKOWN;  

	Context *pContext = new Context(new StateOpened);

	int index = 0;
	while(index < 10)
	{
		switch(index%4+1)
		{
			case 1: event = EVENT_OPEN_DOOR; break;
			case 2: event = EVENT_CLOSE_DOOR; break;
			case 3: event = EVENT_LOCK_DOOR; break;
			case 4: event = EVENT_UNLOCK_DOOR; break;
			default: break;
		}

		index++;  

		string lastStat = pContext->getStateStr();

		pContext->Request(event);

		cout<<setiosflags(ios::left)
			<<setw(15)<<lastStat
			<<" - "
			<<setw(20)<<DoorEventStr[event]
			<<" - "
			<<setw(15)<<pContext->getStateStr()<<endl;

		Sleep(1);
	}

	return 0;
}

参考文献:

《设计模式——可复用面向对象软件的基础》

http://blog.csdn.net/uyghfjhh/article/details/19651225

http://blog.csdn.net/xiexievv/article/details/6733470

有限状态自动机FSM实现(二)--State模式,布布扣,bubuko.com

时间: 2024-10-13 07:35:45

有限状态自动机FSM实现(二)--State模式的相关文章

有限状态自动机FSM实现(一)

有限状态自动机是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型. 使用有限状态自动机可以将复杂的问题简化,比如TCP状态转换. 以前一直不知道怎么实现,今天突然在网络又看到了,这一次决定要研究一下. 不妨以下面的这个自动机为例: 此图来源于网络,请猛击. 门的状态共有4个: Opened, Closed, Locked, Unlocked.事件也有4种:CloseDoor,LockDoor,OpenDoor,UnlockDoor. 本文先提供一种最基本的完整实现,基于switch结

基于有限状态自动机的数据类型识别功能(1)

有限状态自动机(FSM):是一种表达某一状态到另一状态发生转化的数学模型. 例如:在长跑比赛开始时 我处于等待的状态下,待裁判喊 预备 时,我就会从等待状态转换到预备状态.听到裁判的枪声时,我就从预备状态转换到奔跑状态 .这个过程就相当于有限状态自动机. FSM的状态就是一个事件当前所处于的情况. 有限状态自动机在编程中的应用十分广泛 例如:对输入的字符进行判断 判断字符串组成的数字属于整型还是浮点型. 同时它也是词法分析的核心 可用于分析一串字符中给的组成词的含义. 因为最近在学习编译原理,所

State模式详解--设计模式(14)

State模式来源:         每个人.事物在不同的状态下会有不同表现(动作),而一个状态又会在不同的表现下转移到下一个不同的状态(State).最简单的一个生活中的例子就是:地铁入口处,如果你放入正确的地铁票,门就会打开让你通过.在出口处也是验票,如果正确你就可以ok,否则就不让你通过(如果你动作野蛮,或许会有报警(Alarm)). 有限状态自动机(FSM)也是一个典型的状态不同,对输入有不同的响应(状态转移).通常我们在实现这类系统会使用到很多的Switch/Case语句,Case某种

【行为型】State模式

状态模式其意图是在一个对象的状态发生变化时能够同时改变它的行为.一个生活中比较常见的例子就如你(是指你自己本人)在走时时,整个人全身的动作是双手臂前后慢慢摇摆且双脚也是一步一步慢慢往前移的,即:该走路状态下,你所对应的是走路动作:在跑步时,你的双手双脚动作明显频率.步伐都加快,即:在跑步状态下,你所对应的是跑步动作:........:在睡着时,你的全身都是不动的,即:睡着状态下,你是处于睡觉的动作状态.在实际项目开发中,(该模式)最常见的框架设计便是FSM了.模式的类关系结构图参考如下: 编码结

敏捷软件开发 – STATE模式

地铁旋转门 最直接的实现FSM策略的方式是使用嵌套switch/case语句. public enum State { LOCKED, UNLOCKED }; public enum Event { COIN, PASS }; public class TurnStile { private State state = State.LOCKED; private TurnstileController turnstileController; public TurnStile(Turnstile

用java开发编译器之:Thompson构造,将正则表达式转换为有限状态自动机

阅读博客的朋友可以到我的网易云课堂中,通过视频的方式查看代码的调试和执行过程: http://study.163.com/course/courseMain.htm?courseId=1002830012 上一节,我们通过代码,实现了一个有限状态自动机,并将其应用于对整形和浮点数的识别.构造有限状态自动机,并驱动它,从而实现对输入字符串的识别,整个过程就是词法分析的本质. 上一节所开发的状态机,基于以下模型: 这个模型,是我们在代码中,手动写入程序的.实则上,它对应着一组正则表达式: D    

敏捷软件开发(1)--- STATE 模式

如果状态在运行过程中,不停的切换和改变,我们怎么办? 状态的迁移是我们生活和工程中非常普遍的一个概念.于是在数学上有一种理论来分析和解决这个问题. 有限状态机理论是一个非常成熟的理论,所有动作和流程的迁移可以归结为状态的迁移. 这个理论的前提是: 状态的数目是确定的,或者说是有限的. 状态的迁移方向是固定的,也就是有向的. 状态存储关于过去的信息,就是说:它反映从系统开始到现在时刻的输入变化.转移指示状态变更,并且用必须满足来确使转移发生的条件来描述它.动作是在给定时刻要进行的活动的描述.有多种

从零写一个编译器(四):语法分析之构造有限状态自动机

项目的完整代码在 C2j-Compiler 通过上一篇对几个构造自动机的基础数据结构的描述,现在就可以正式来构造有限状态自动机 我们先用一个小一点的语法推导式来描述这个过程 s -> e e -> e + t e -> t t -> t * f t -> f f -> ( e ) f -> NUM 初始化 状态0是状态机的初始状态,它包含着语法表达式中的起始表达式,也就是编号为0的表达式: 0: s -> . e 这里的点也就是之前Production类中的

hdu5384 AC自动机模板题,统计模式串在给定串中出现的个数

http://acm.hdu.edu.cn/showproblem.php?pid=5384 Problem Description Danganronpa is a video game franchise created and developed by Spike Chunsoft, the series' name is compounded from the Japanese words for "bullet" (dangan) and "refutation&q