一个简单的状态机

状态机在设计的时候,可以看到,其之间的构建关系:
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;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值