您的位置:首页 > 其它

状态模式

2015-09-29 22:15 387 查看
概念

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 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  状态模式