《大话设计模式》
状态模式:当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类。
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断转移到表示不同状态的一系列类中,
可以把复杂的判断逻辑简化。
//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点 不行了,睡着了。
--------------