状态机在设计的时候,可以看到,其之间的构建关系:
1.某个状态?
2.谁拥有或使用这个状态?
3.在这个状态下我们要做什么?
下面是个基类与owner
#pragma once
enum class EState
{
OFF,
LOWLight,
HIGHLight,
};
class Machine;
class State
{
public:
virtual ~State() = default;
int Exit(Machine* m){ return OnExit(m);}
int Enter(Machine* m){return OnEnter(m);}
// virtual int StateChange() = 0;
virtual int CheckState(EState nextState) = 0;
protected:
virtual int OnExit(Machine*){}
virtual int OnEnter(Machine*){}
protected:
EState state;
};
下面是一其实现子类的实现与拥有者的结构
class OffState : public State
{
public:
OffState() : state(EState::OFF) {}
int CheckState(EState nextState)
{
if (state != EState::LOWLight) {
return -1;
}
return 0;
}
int OnExit(Machine* m) override {
// dosomething for m ......
// m->SomeActionExit();
return 0;
}
int OnEnter(Machine* m) override {
// dosomething for m ......
// m->SomeActionEnter();
return 0;
}
};
class LowLightState : public State
{
public:
LowLightState() : state(EState::LOWLight) {}
virtual int CheckState(EState nextState)
{
return 0;
}
};
class HighLightState : public State
{
public:
HighLightState() : state(EState::HIGHLight) {}
virtual int CheckState(EState nextState){
return 0;
}
};
static State* Create(EState state)
{
switch (state)
{
case EState::OFF:
return new OffState();
break;
case EState::LOWLight :
return new LowLightState();
case EState::HIGHLight :
return new HighLightState();
default:
break;
}
}
class Machine
{
public:
void StateChange(State* ptr)
{
if (m_state->CheckState(ptr->state) != 0) {
return;
}
m_state->Exit(this);
m_state = ptr;
m_state->Enter(this);
}
void StateChange(EState st)
{
if (m_state->CheckState(st) != 0) {
return;
}
m_state->Exit(this);
// free(m_state); m_state = nullptr;
m_state = Create(st);
m_state->Enter(this);
}
private:
State* m_state;
};