1.状态模式简介
- 英文名称
State - 主要目的
允许一个对象在其内部状态改变时,改变其行为。 - 使用场景
1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为;
2.一个操作中含有庞大的多分支条件语句,且这些分支依赖于该对象的状态。
2.状态模式代码示例
- 测试平台
1.开发语言:C++
2.开发工具:VS2015
3.操作系统:Win7 X64 - 代码说明
1.Employee–职员类;
2.State–状态类,定义各种状态的虚函数接口;
3.NightState、AfternoonState、NoonState、ForenoonState、MorningState–状态类,给出各种状态定义,实现条件判断。
注意:
1.本例以用状态模式来描述每天的活动状态;
2. 初始化职员类时,应以初始状态来赋值,如本例中的早上状态。
- 具体代码
#include <iostream>
using namespace std;
//本例以用状态模式来描述每天的活动状态
//职员类
class Employee;
//状态类,定义接口。
class State
{
public:
//函数功能:早上行为状态
//参数: 无
//返回值: 无
virtual void Mooning() {}
//函数功能:上午行为状态
//参数: 无
//返回值: 无
virtual void Forenoon() {}
//函数功能:中午行为状态
//参数: 无
//返回值: 无
virtual void Noon() {}
//函数功能:下午行为状态
//参数: 无
//返回值: 无
virtual void Afternoon() {}
//函数功能:晚上行为状态
//参数: 无
//返回值: 无
virtual void Ninght() {}
//函数功能:给出当前状态
//参数: Employee *pEmployee[IN] -- 职员
//返回值: 无
virtual void CurrentState(Employee *pEmployee) {};
};
//职员类
class Employee
{
public:
//函数功能:职员类构造函数,给出初始状态
//参数: Employee *pEmployee[IN] -- 职员
//返回值: 无
//注意: 初始化志愿类时,应以初始状态来赋值,如本例中的早上状态
Employee(State *pState)
: m_pState(pState),
m_Hour(8)
{}
//函数功能:析构函数,释放指针
//参数: 无
//返回值: 无
~Employee()
{
if (this->m_pState != NULL)
{
delete this->m_pState;
this->m_pState = NULL;
}
}
int GetHour()
{
return this->m_Hour;
}
void SetHour(int hour)
{
this->m_Hour = hour;
}
void SetState(State *pState)
{
if (this->m_pState != NULL)
{
delete this->m_pState;
this->m_pState = NULL;
}
this->m_pState = pState;
}
void GetState()
{
this->m_pState->CurrentState(this);
}
private:
State *m_pState; //当前状态
int m_Hour; //当前时间
};
//晚上状态
class NightState : public State
{
public:
void Night(Employee *pEmployee) //结束阶段的具体行为
{
cout << "晚上,休息中" << endl;
}
void CurrentState(Employee *pEmployee)
{
Night(pEmployee);
}
};
//下午状态
class AfternoonState : public State
{
public:
void Afternoon(Employee *pEmployee) //结束阶段的具体行为
{
if (pEmployee->GetHour() > 13 && pEmployee->GetHour() <=16)
{
cout << "下午,努力干活中,状态一般..." << endl;
}
else
{
pEmployee->SetState(new NightState());
pEmployee->GetState();
}
}
void CurrentState(Employee *pEmployee)
{
Afternoon(pEmployee);
}
};
//中午状态
class NoonState : public State
{
public:
void Noon(Employee *pEmployee) //结束阶段的具体行为
{
if (pEmployee->GetHour() > 11 && pEmployee->GetHour() <= 12)
{
cout << "中午,午餐休息中..." << endl;
}
else
{
pEmployee->SetState(new AfternoonState());
pEmployee->GetState();
}
}
void CurrentState(Employee *pEmployee)
{
Noon(pEmployee);
}
};
//上午状态
class ForenoonState : public State
{
public:
void Forenoon(Employee *pEmployee) //结束阶段的具体行为
{
if (pEmployee->GetHour() > 8 && pEmployee->GetHour() <= 11)
{
cout << "上午,努力干活中,精力充沛..." << endl;
}
else
{
pEmployee->SetState(new NoonState());
pEmployee->GetState();
}
}
void CurrentState(Employee *pEmployee)
{
Forenoon(pEmployee);
}
};
//早上状态
class MorningState : public State
{
public:
void Morning(Employee *pEmployee)
{
if (pEmployee->GetHour() > 7 && pEmployee->GetHour() <= 8)
{
cout << "早上,早餐中..." << endl;
}
else
{
pEmployee->SetState(new ForenoonState());
pEmployee->GetState();
}
}
void CurrentState(Employee *pEmployee)
{
Morning(pEmployee);
}
};
int main()
{
Employee *pXiaoMing = new Employee(new MorningState());
int hour = 8;
//早上状态
cout << "当前时间:" << hour << ":00" << endl;
cout << "小明状态:";
pXiaoMing->SetHour(hour);
pXiaoMing->GetState();
//上午状态
hour = 11;
cout << "当前时间:" << hour << ":00" << endl;
cout << "小明状态:";
pXiaoMing->SetHour(hour);
pXiaoMing->GetState();
//中午状态
hour = 12;
cout << "当前时间:" << hour << ":00" << endl;
cout << "小明状态:";
pXiaoMing->SetHour(hour);
pXiaoMing->GetState();
//下午状态
hour = 15;
cout << "当前时间:" << hour << ":00" << endl;
cout << "小明状态:";
pXiaoMing->SetHour(hour);
pXiaoMing->GetState();
//晚上状态
hour = 19;
cout << "当前时间:" << hour << ":00" << endl;
cout << "小明状态:";
pXiaoMing->SetHour(hour);
pXiaoMing->GetState();
delete pXiaoMing;
pXiaoMing = NULL;
getchar();
return 0;
}
- 输出结果
栏目导航
上一篇:设计模式学习笔记(C++实现)(二十)–观察者模式
下一篇:设计模式学习笔记(C++实现)(二十二)–策略模式
参考文献:
1.《设计模式:可复用面向对象软件的基础》