的state pattern避免公众`SETSTATE()在C++`状态接口模式实现
本身是实现状态机,因为它允许封装状态转换逻辑非常好的模式状态本身并添加一个新的状态实际上变得更容易,因为你只需要在相关状态下进行更改。
但是,在描述中通常会避免状态如何改变。
如果您在Context
中实现了状态更改逻辑,那么整个模式点都会丢失,但是如果您在状态中实现状态更改逻辑,那意味着您需要在Context
中设置新状态。
最常见的方式是将公共方法添加到Context
SetState()
并通过参考Context
的状态对象,所以这将是能够设置一个新的状态,但本质上它允许用户更改外部的状况状态机。
为了避免它,我来到了以下解决方案:
class IContext {
public:
virtual void SetState(unique_ptr<IState> newState) = 0;
}
class Context : public IContext {
private:
virtual void SetState(unique_ptr<IState> newState) override { ... };
}
但总的来说改变派生类中的方法范围不看起来非常好。
是否有另一种方法来隐藏此接口(朋友类不是一个选项,因为它需要更改每个状态被添加的Context
类)?
在C++中,FSM最好通过模板元编程实现。 Boost :: MPL虽然有些过时,但提供了一个示例:http://www.boost.org/doc/libs/1_31_0/libs/mpl/doc/paper/html/example.html – SergeyA
使用std :: variant和visit对于状态机也提供了一些显着的优点。但这个问题的答案超出了范围。 –