详解详解state状态模式及在状态模式及在C++设计模式编程中的使用实例设计模式编程中的使用实例
每个人、事物在不同的状态下会有不同表现(动作),而一个状态又会在不同的表现下转移到下一个不同的状态(State)。
最简单的一个生活中的例子就是:地铁入口处,如果你放入正确的地铁票,门就会打开让你通过。在出口处也是验票,如果正
确你就可以 ok,否则就不让你通过(如果你动作野蛮,或许会有报警(Alarm),:))。
有限状态自动机(FSM)也是一个典型的状态不同,对输入有不同的响应(状态转移)。
通常我们在实现这类系统会使用到很多的 Switch/Case 语句,Case 某种状态,发生什么动作,Case 另外一种状态,则发生
另外一种状态。但是这种实现方式至少有以下两个问题:
当状态数目不是很多的时候,Switch/Case 可能可以搞定。但是当状态数目很多的时候(实际系统中也正是如此),维护一大
组的 Switch/Case 语句将是一件异常困难并且容易出错的事情。
状态逻辑和动作实现没有分离。在很多的系统实现中,动作的实现代码直接写在状态的逻辑当中。这带来的后果就是系统的扩
展性和维护得不到保证。
状态模式就是被用来解决上面列出的两个问题的,在状态模式中我们将状态逻辑和动作实现进行分离。当一个操作中要维护大
量的 case 分支语句,并且这些分支依赖于对象的状态。状态模式将每一个分支都封装到独立的类中。
状态模式典型的结构图为:状态模式典型的结构图为:
状态模式的实现状态模式的实现
代码片断 1:State.h
//state.h
#ifndef _STATE_H_
#define _STATE_H_
class Context; //前置声明
class State{
public:
State();
virtual ~State();
virtual void OperationInterface(Context* ) = 0;
virtual void OperationChangeState(Context*) = 0;
protected:
bool ChangeState(Context* con,State* st);
private:
//bool ChangeState(Context* con,State* st);
};
class ConcreteStateA:public State{
public:
ConcreteStateA();
virtual ~ConcreteStateA();
virtual void OperationInterface(Context* );
virtual void OperationChangeState(Context*);
protected:
private:
};
class ConcreteStateB:public State{
public:
ConcreteStateB();
virtual ~ConcreteStateB();
virtual void OperationInterface(Context* );
virtual void OperationChangeState(Context*);
protected:
private:
};
#endif //~_STATE_H_