状态模式
来源:互联网 发布:js confirm的返回值 编辑:程序博客网 时间:2024/05/22 13:10
《大话设计模式》
状态模式:当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类。
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断转移到表示不同状态的一系列类中,
可以把复杂的判断逻辑简化。
//state.h#ifndef _STATE_H_#define _STATE_H_#include <iostream>using namespace std;class State;class Work{public:Work():current(NULL){}~Work(){}double getHour();void setHour(double hour);bool getFinish();void setFinish(bool finish);void setState(State *s);void writeProgramm();private:auto_ptr<State> current;double hour;bool finish;};class State{public:virtual ~State(){cout << "State destructor" << endl;}virtual void writeProgramm(Work *w) = 0;};class ForenoonState:public State{public:~ForenoonState(){cout << "ForenoonState" << endl;}void writeProgramm(Work *w);};class NoonState:public State{public:~NoonState(){cout << "NoonState" << endl;}void writeProgramm(Work *w);};class AfternoonState:public State{public:~AfternoonState(){cout << "AfternoonState" << endl;}void writeProgramm(Work *w);};class EveningState:public State{public:~EveningState(){cout << "EveningState" << endl;}void writeProgramm(Work *w);};class SleepingState:public State{public:~SleepingState(){cout << "SleepingState" << endl;}void writeProgramm(Work *w);};class RestState:public State{public:~RestState(){cout << "RestState" << endl;}void writeProgramm(Work *w);};#endif
//state.cpp#include "state.h"double Work::getHour(){return hour;}void Work::setHour(double hour){this->hour = hour;}bool Work::getFinish(){return finish;}void Work::setFinish(bool finish){this->finish = finish;}void Work::setState(State *s){current = auto_ptr<State>(s);}void Work::writeProgramm(){current->writeProgramm(this);}void ForenoonState::writeProgramm(Work *w){if(w->getHour() < 12){cout << "当地时间:" << w->getHour() << "点 上午工作,精神百倍" << endl; }else{ w->setState(new NoonState()); w->writeProgramm(); } }void NoonState::writeProgramm(Work *w){if(w->getHour() < 13){cout << "当地时间:" << w->getHour() << "点 饿了,午饭;犯困,午休。" << endl; }else{ w->setState(new AfternoonState()); w->writeProgramm(); } } void AfternoonState::writeProgramm(Work *w){if(w->getHour() < 17){cout << "当地时间:" << w->getHour() << "点 下午状态还不错,继续努力。" << endl; }else{ w->setState(new EveningState()); w->writeProgramm(); } } void EveningState::writeProgramm(Work *w){if(w->getFinish()) {w->setState(new RestState());w->writeProgramm();} else{ if(w->getHour() < 21){cout << "当地时间:" << w->getHour() << "点 下加班哦,疲惫之极。" << endl; }else{ w->setState(new SleepingState()); w->writeProgramm(); } } }void SleepingState::writeProgramm(Work *w){cout << "当地时间:" << w->getHour() << "点 不行了,睡着了。" << endl; }void RestState::writeProgramm(Work *w){cout << "当地时间:" << w->getHour() << "点 下班回家。" << endl; }
//stateMain.cpp#include "state.h"int main(){Work project;project.setState(new ForenoonState()); project.setHour(9); project.writeProgramm();cout << "--------------" << endl; project.setHour(10); project.writeProgramm();cout << "--------------" << endl;project.setHour(12); project.writeProgramm();cout << "--------------" << endl; project.setHour(13); project.writeProgramm();cout << "--------------" << endl; project.setHour(14); project.writeProgramm();cout << "--------------" << endl;project.setHour(17); project.setFinish(false); project.writeProgramm();cout << "--------------" << endl;project.setHour(19); project.writeProgramm();cout << "--------------" << endl; project.setHour(22); project.writeProgramm();cout << "--------------" << endl; return 0;}
输出结果:
当地时间:9点 上午工作,精神百倍
--------------
当地时间:10点 上午工作,精神百倍
--------------
ForenoonState
State destructor
当地时间:12点 饿了,午饭;犯困,午休。
--------------
NoonState
State destructor
当地时间:13点 下午状态还不错,继续努力。
--------------
当地时间:14点 下午状态还不错,继续努力。
--------------
AfternoonState
State destructor
当地时间:17点 下加班哦,疲惫之极。
--------------
当地时间:19点 下加班哦,疲惫之极。
--------------
EveningState
State destructor
当地时间:22点 不行了,睡着了。
--------------
- 状态模式(状态变化)
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- postgresql常用函数汇总
- CentOS设置服务开机自动启动
- log4cpp在unix下的使用
- 深入浅出 iOS 之生命周期
- Struts2+Spring 整合成功测试案例--整合过程中遇到的问题及解决方法(一)
- 状态模式
- UVA 5986 - Wizarding Duel
- Oracle APEX支持基于云计算的网络开发
- enable magento show error log
- 半平面交讲解 - N^2写法
- 两行代码,理解了一个小时! 两个数组记录邻接表! ( 刘汝佳白书)
- 黑马程序员_IO流
- iPhone界面跳转
- linux 源码包的制作