Design Pattern之状态模式

状态模式,当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。状态模式主要解决的是当控制一个对象状态转换的条件表达式对于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列当中,可以把复杂的判断逻辑简化。当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式。
下面是状态模式的结构图:
这里写图片描述
下面是代码:

class Work;

class State
{
public:
    State() {}
    virtual ~State() {}
    virtual void WriteProgram(Work* __w) = 0;
};
class Work
{
private:
    State *m_pState;
    int m_iHour;
    bool m_bTaskFinished;
public:
    Work( State* __s )
    {
        m_bTaskFinished = false;
        m_iHour = 8; 
        m_pState = __s;
    }

    ~Work()
    {
        if (m_pState)
        {
            delete m_pState;
            m_pState =  NULL;
        }   
    }

    int GetHour()
    {
        return m_iHour;
    }

    void  SetHour( int __h)
    {
        m_iHour = __h;
    }

    bool  GetTaskFinished()
    {
        return m_bTaskFinished;
    }

    void  SetTaskFinished(bool __t)
    {
        m_bTaskFinished = __t;
    }

    void SetState(State* __s)
    {
        if (m_pState != NULL)
        {
            delete m_pState;
            m_pState = NULL;
        }
        m_pState = __s;
    }

    void Request()
    {
        m_pState->WriteProgram( this );
    }

};
class ForenoonState : public State
{
public:
    ForenoonState() {}
    ~ForenoonState() {}

    virtual void WriteProgram( Work* __w)
    {
        if (__w->GetHour() < 12)
        {
            printf("当前时间:%d点 上午工作,精神百倍\n", __w->GetHour());
        }
        else
        {
            __w->SetState( new NoonState());
            __w->Request();
        }
    }
};
class NoonState : public State
{
public:
    NoonState() {}
    ~NoonState() {}
    virtual void WriteProgram(Work* __w)
    {
        if (__w->GetHour() < 13)
        {
            printf("当前时间:%d点 饿了,午饭;犯困,午休\n", __w->GetHour());
        }
        else
        {
            __w->SetState(new AfternoonState());
            __w->Request();
        }
    }
};
class AfternoonState : public State
{
public:
    AfternoonState() {}
    ~AfternoonState() {}
    virtual void WriteProgram(Work* __w)
    {
        if (__w->GetHour() < 17)
        {
            printf("当前时间:%d点 下午状态还不错,继续努力\n", __w->GetHour());
        }
        else
        {
            __w->SetState(new EveningState());
            __w->Request();
        }
    }
};
class EveningState : public State
{
public:
    EveningState() {}
    ~EveningState() {}
    virtual void WriteProgram(Work* __w)
    {
        if (__w->GetTaskFinished())
        {
            __w->SetState(new RestState());
            __w->Request();
        }
        else
        {
            if (__w->GetHour() < 21 )
            {
                printf("当前时间:%d点 加班哦,疲累之极\n", __w->GetHour());
            }
            else
            {
                __w->SetState(new SleepingState());
                __w->Request();
            }
        }

    }
};

运行结果:
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值