- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
class Context;
class AbstractState
{
Context * m_context;
protected:
Context * context() const { return m_context; }
public:
AbstractState(Context * context) : m_context(context) { };
virtual ~AbstractState() { }
virtual void doSomething() = 0;
};
class Context
{
std::unique_ptr<AbstractState> m_state;
public:
enum State
{
State1,
State2,
};
Context() { switchToState(State1); }
void switchToState(State newState);
void doSomething() { m_state->doSomething(); }
void someCleanup() { }
};
class ConcreteState1 : public AbstractState
{
public:
ConcreteState1(Context * context) : AbstractState(context) { }
virtual void doSomething()
{
context()->switchToState(Context::State2);
context()->someCleanup();
}
};
class ConcreteState2 : public AbstractState
{
public:
ConcreteState2(Context * context) : AbstractState(context) { }
virtual void doSomething()
{
context()->switchToState(Context::State1);
context()->someCleanup();
}
};
void Context::switchToState(State newState)
{
switch(newState)
{
case State1:
m_state.reset(new ConcreteState1(this));
return;
case State2:
m_state.reset(new ConcreteState2(this));
return;
}
}
Бывает, на меня находит состояние "сначала делай, потом думай", благо результат был быстро обнаружен отладчиком.
bormand 10.03.2013 07:40 # +1