状态模式

来源:互联网 发布:打开数据连接无法上网 编辑:程序博客网 时间:2024/05/29 12:36

概念

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

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

角色和职责

这里写图片描述

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

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

案例

#include <iostream>using namespace std;#include "string"class Worder;class State{public:    virtual void    changestate(int hour) = 0;    virtual void    doSomeThing(Worder *w) = 0;};class Worder{public:    Worder();    void setName(string name)    {        m_name = name;    }    string getName()    {        return m_name;    }    void changestate(int hour)    {        m_hour = hour;    }    int getHour()    {        return m_hour;    }    void setState(State *s)    {        m_currentstate = s;    }    State * getState()    {        return m_currentstate;    }    void doSomeThing()    {        m_currentstate->doSomeThing(this); //    }private:    int     m_hour;    State   *m_currentstate;    string  m_name;};class State1 : public State{public:    void changestate(int hour)    {        m_hour = hour;    }    void doSomeThing(Worder *w);private:    int m_hour;};class State2 : public State{public:    void    changestate(int hour)    {        m_hour = hour;    }    virtual void doSomeThing(Worder *w);private:    int m_hour;}; void State1::doSomeThing(Worder *w){    if (w->getHour()==7 || w->getHour() == 8)    {        cout  << " 吃早饭" << endl;    }    else    {        delete w->getState();  //状态1 不满足 要转到状态2        w->setState(new State2);        w->getState()->doSomeThing(w);    }} //将要:状态逻辑 和 动作 分离 void State2::doSomeThing(Worder *w) {     if (w->getHour()==9 || w->getHour() == 10)  //状态2 不满足 要转到状态3 .     {         cout  << "工作 " << endl;     }     else     {         delete w->getState();         w->setState(new State1); //恢复到当初状态         cout << "当前时间点:" << m_hour << "未知状态" << endl;     } }Worder::Worder(){    m_currentstate = new State1;}void main(){    Worder *w1 = new Worder;    w1->setName("小王");    w1->changestate(7);    w1->doSomeThing();    w1->changestate(10);    w1->doSomeThing();    delete w1;    cout<<"hello..."<<endl;    system("pause");    return ;}
0 0
原创粉丝点击