我正在使用c++中的协议设计代码,需要有关状态机设计的帮助。
我们拥有的所有状态机都具有相同的性质。每个状态机都有特定的状态(S1、S2等),每个状态只能接受特定类型的事件(E1、E2等)。基于事件处理的结果,机器移动到下一个状态。
例如,从状态S1和事件E1,机器可以移动到S2或S3。我研究了states模式,但是它建议所有的状态(派生的状态类)都应该实现状态机可以执行的所有动作,或者基态类应该实现这样的操作。在我的例子中,单个状态只能处理某些事件,所以我认为状态设计模式将不适用。
你能建议怎样才能最好地实现这样的机器吗?
发布于 2014-08-26 21:57:41
根据“四人帮”,当对象的行为取决于其状态时,状态设计模式是适用的,并且它必须在运行时根据状态改变行为。
状态机的描述(它根据事件更改状态)似乎与此描述相匹配。
class StateMachine { // state machine that processes events received
State *s;
public:
StateMachine(); // constructor: here you shall set initial state
void process (Event* e); // processes the event and sets the next state
bool isReady (); // example of other requests
};这种模式的原理是有一个抽象基类,定义StateMachine可能委托给一个状态的所有潜在状态依赖的“动作”。
class State {
public:
virtual void process (StateMachine *m, Event* e)=0; // called by state machine / pure virtual MUST be implemented in concrete state
virtual bool isReady(StateMachine *m); // example
... // other "actions"
};然后,可以很容易地定义状态和状态机之间的接口。例如:
void StateMachine::Process (Event *e) {
s->Process (this, e); // calls the Process() of the current state
}导出的具体状态随后将实施不同的行为。由于此*模式适用于C++中的虚拟函数,因此必须为每个具体状态(无论是基类还是派生状态)定义所有操作。这是定义虚拟函数的直接结果。
但是对于与所有状态无关的操作,您可能有一个默认操作,要么什么也不做,或者触发错误(错误消息、异常、.)。这取决于你的总体设计,你是否防止这种情况发生。
例如:
bool State::isReady(StateMachine *m) { // if this request is only relevant for a couple of states
throw std::exception ("unauthorized request"); // trigger an exception if it happens
return false;
} // this is done by default, except for concrete state that defines somtehing else 根据你的描述,我真的很喜欢国家模式。
https://stackoverflow.com/questions/25515317
复制相似问题