行为型模式之状态模式实现

概念

状态模式是行为模式的一种。State模式允许通过改变对象的内部状态而改变对象的行为,这个对象表现得就好像修改了它的类一样。

状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转译到表现不同状态的一系列类当中,可以把复杂的判断逻辑简化。
状态模式问题来源

角色和职责

状态模式

Context:用户对象,拥有一个State类型的成员,以标识对象的当前状态;
State:接口或基类,封装与Context的特定状态相关的行为;
ConcreteState:接口实现类或子类,实现了一个与Context某个状态相关的行为。

适用于:对象的行为,依赖于它所处的当前状态。行为随状态改变而改变的场景。即适用于通过用户的状态来改变对象的行为。

案例

#include <iostream>
using namespace std;

class Worker;

class State
{
public:
    virtual void doSomeThing(Worker *w) = 0;    
};

class Worker
{
public:
    Worker();
    int getHour()
    {
        return m_hour;
    }
    void setHour(int hour)
    {
        m_hour = hour;
    }
    State *getCurrentState()
    {
        return m_currstate;
    }
    void setCurrentState(State *state)
    {
        m_currentstate = state;
    }

    void doSomeThing()
    {
        m_currstate->doSomeThing(this);
    }

private:
    int m_hour;
    State *m_currstate;  //对象的当前状态
};

class State1:public State
{
public:
    void doSomeThing(Worker *w);
};

class State2:public State
{
public:
    void doSomeThing(Worker *w);
};

void State1:doSomeThing(Worker *w)
{
    if(w->getHour() == 7 || w->getHour()==8)
    {
        cout << "吃早饭" << endl; 
    }
    else
    {
        //状态1 不满足 要转到状态2
        delete w->getCurrentState(); 
        w->setCurrentState(new State2);
        w->getCurrentState()->doSomwThing(w);
    }

}

void State1:doSomeThing(Worker *w)
{
    if(w->getHour() == 9 || w->getHour()==10)
    {
        cout << "工作" << endl; 
    }
    else
    {
        //状态2 不满足 要转到状态3 后者恢复到初始化状态
        delete w->getCurrentState(); 
        w->setCurrentState(new State1); //恢复到当初状态
        cout << "当前时间点:" << w->getHour() << "未知状态" << endl;
    }

}

//Worker初始状态
Worker:Worker()
{
    m_currstate = new State1;
}

#int main(void)
{
    Worker *w1 = new Worker;
    w1->setHour(7);
    w1->doSomeThing();

    w1->setHour(9);
    w1->doSomeThing();

    delete w1;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tingzhushaohua

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值