我有一个具有多个状态的应用程序,每个状态以不同的方式响应输入。处理多个状态的输入和状态变化的最佳方法?
最初的实现是用一个大的switch语句完成的,我使用状态模式重构了这个语句(至少,我认为它是状态模式,我对使用设计模式很陌生,所以我倾向于让它们困惑) -
class App {
public:
static App * getInstance();
void addState(int state_id, AppState * state) { _states[state_id] = state; }
void setCurrentState(int state_id) { _current_state = _states[state_id]; }
private:
App()
~App();
std::map<int, AppState *> _states;
AppState * _current_state;
static App * _instance;
}
class AppState {
public:
virtual void handleInput() = 0;
virtual ~AppState();
protected:
AppState();
}
当前,每个状态轮询操作系统的输入,并采取相应的行动。这意味着每个具体状态都有一个巨大的开关语句,每个有效的按键都有一个情况。有些情况下调用函数,其他情况下通过使用App :: setCurrentState(newstate)来发布状态更改。问题在于,在另一个州执行某项操作的密钥可能无法做任何事情(或在极少数情况下可能会做出不同的事情)。
好的,我认为这是相关的背景。下面是实际问题 -
首先,消除具体状态下的巨大开关语句的最佳方法是什么? This question建议命令模式,但我不明白我会在这里使用它。有人可以帮助解释它,或者提出其他解决方案吗?作为一个便笺,我已经考虑(并且不反对)让App类执行操作系统轮询,然后将输入传递给_current_state-> handleInput。事实上,有些东西告诉我,我将要做这个重构的一部分。我还没有做到。
其次,通过调用App :: setCurrentState(newstate)进行状态更改。我意识到这与使用全局变量类似,但我不确定是否有更好的方法来做到这一点。我的主要目标是能够在不修改App类的情况下添加状态。建议也欢迎在这里。
将输入封装到一个类将很容易。虽然, 我不明白责任链将如何工作,因为一次只有一个国家会活跃。 – 2008-12-05 23:34:42