状态模式
其他二十三种设计模式
#include<iostream>
using namespace std;
class DoWork;
class State {
public:
virtual void WriteProgram(DoWork* _work) = 0;
};
class ForenoonState :public State {
public:
virtual void WriteProgram(DoWork* _work);
};
class NoonState :public State {
public:
virtual void WriteProgram(DoWork* _work);
};
class AfternoonState :public State {
public:
virtual void WriteProgram(DoWork* _work);
};
class EveningState :public State {
public:
virtual void WriteProgram(DoWork* _work);
};
class SleepingState :public State {
public:
virtual void WriteProgram(DoWork* _work);
};
class RestState :public State {
public:
virtual void WriteProgram(DoWork* _work);
};
class DoWork {
public:
DoWork() {
this->current = new ForenoonState();
}
void SetHour(double _hour) {
this->hour = _hour;
}
double GetHour() {
return hour;
}
void SetTaskFinished(bool _finish) {
this->finish = _finish;
}
bool GetTaskFinished() {
return finish;
}
void SetState(State* _current) {
this->current = _current;
}
void WriteProgram() {
current->WriteProgram(this);
}
private:
State* current;
double hour = 0.0;
bool finish = false;
};
void ForenoonState::WriteProgram(DoWork* _work) {
if (_work->GetHour() < 12)
cout << "当前时间: " << _work->GetHour() << " 点, 上午工作, 精神百倍" << endl;
else {
_work->SetState(new NoonState());
_work->WriteProgram();
}
}
void NoonState::WriteProgram(DoWork* _work) {
if (_work->GetHour() < 13)
cout << "当前时间: " << _work->GetHour() << " 点, 饿了,午饭;犯困,午休" << endl;
else {
_work->SetState(new AfternoonState());
_work->WriteProgram();
}
}
void AfternoonState::WriteProgram(DoWork* _work) {
if (_work->GetHour() < 17)
cout << "当前时间: " << _work->GetHour() << " 点, 下午状态不错,继续努力" << endl;
else {
_work->SetState(new EveningState());
_work->WriteProgram();
}
}
void EveningState::WriteProgram(DoWork* _work) {
if (_work->GetTaskFinished()) {
_work->SetState(new RestState());
}
else {
if (_work->GetHour() < 21)
cout << "当前时间: " << _work->GetHour() << " 点, 加班哦,疲劳至极" << endl;
else {
_work->SetState(new SleepingState());
_work->WriteProgram();
}
}
}
void SleepingState::WriteProgram(DoWork* _work) {
cout << "当前时间: " << _work->GetHour() << " 点,不行了,睡着了" << endl;
}
void RestState::WriteProgram(DoWork* _work) {
cout << "当前时间: " << _work->GetHour() << " 点, 下班回家了" << endl;
}
void test1() {
DoWork* wk = new DoWork;
wk->SetHour(9);
wk->WriteProgram();
wk->SetHour(10);
wk->WriteProgram();
wk->SetHour(12);
wk->WriteProgram();
wk->SetHour(13);
wk->WriteProgram();
wk->SetHour(14);
wk->WriteProgram();
wk->SetHour(17);
wk->SetTaskFinished(false);
wk->WriteProgram();
wk->SetHour(19);
wk->WriteProgram();
wk->SetHour(22);
wk->WriteProgram();
delete wk;
}
int main() {
test1();
return 0;
}