状态模式:
概念:当一个对象的内部状态改变时,允许改变其行为,这个对象看起来像是改变了其类。
状态模式主要解决的是当控制一个对象状态的转换条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。
应用场景:当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时。
1 //State.h 2 #ifndef STATE 3 #define STATE 4 extern class Work; 5 class State 6 { 7 public: 8 State(){}; 9 virtual void writeProgram(Work* w){}; 10 }; 11 class ForenoonState:public State 12 { 13 public: 14 void writeProgram(Work* w); 15 }; 16 17 class NoonState:public State 18 { 19 public: 20 void writeProgram(Work* w); 21 }; 22 class AfternoonState:public State 23 { 24 public: 25 void writeProgram(Work* w); 26 }; 27 class EveningState:public State 28 { 29 public: 30 void writeProgram(Work* w); 31 }; 32 class SleepingState:public State 33 { 34 public: 35 void writeProgram(Work* w); 36 }; 37 class RestState:public State 38 { 39 public: 40 void writeProgram(Work* w); 41 }; 42 #endif
1 //State.cpp 2 #include <iostream> 3 #include "State.h" 4 #include "Work.h" 5 6 using namespace std; 7 8 void ForenoonState::writeProgram(Work* w) 9 { 10 if(w->getHour()<12) 11 { 12 cout<<"当前时间:"<<w->getHour()<<"点 "<<"上午工作,精神百倍"<<endl; 13 } 14 else 15 { 16 w->setState(new NoonState); 17 w->writeProgram(); 18 } 19 } 20 21 void NoonState::writeProgram(Work* w) 22 { 23 if(w->getHour()<13) 24 { 25 cout<<"当前时间:"<<w->getHour()<<"点 "<<"饿了,午饭;犯困,午休"<<endl; 26 } 27 else 28 { 29 w->setState(new AfternoonState); 30 w->writeProgram(); 31 } 32 } 33 34 void AfternoonState::writeProgram(Work* w) 35 { 36 if(w->getHour()<17) 37 cout<<"当前时间:"<<w->getHour()<<"点 "<<"下午状态还不错,继续努力"<<endl; 38 else 39 { 40 w->setState(new EveningState); 41 w->writeProgram(); 42 } 43 } 44 45 void EveningState::writeProgram(Work* w) 46 { 47 if(w->getFinish()) 48 { 49 w->setState(new RestState); 50 w->writeProgram(); 51 } 52 else 53 { 54 if(w->getHour()<21) 55 cout<<"当前时间:"<<w->getHour()<<"点 "<<"加班哦,疲惫至极"<<endl; 56 else 57 { 58 w->setState(new SleepingState); 59 w->writeProgram(); 60 } 61 } 62 } 63 64 void SleepingState::writeProgram(Work* w) 65 { 66 cout<<"当前时间:"<<w->getHour()<<"点 "<<"不行了,睡着了"<<endl; 67 } 68 69 void RestState::writeProgram(Work* w) 70 { 71 cout<<"当前时间:"<<w->getHour()<<"点 "<<"下班回家了"<<endl; 72 }
1 //Work.h 2 #ifndef WORK 3 #define WORK 4 5 #include "State.h" 6 7 8 class Work 9 { 10 private: 11 State* current; 12 13 double Hour; 14 bool finish; 15 16 public: 17 Work(); 18 ~Work(); 19 20 double getHour(); 21 void setHour(double HOUR); 22 23 bool getFinish(); 24 void setFinish(bool FINISH); 25 26 void setState(State* s); 27 28 void writeProgram(); 29 }; 30 31 #endif
1 //Work.cpp 2 #include "Work.h" 3 4 5 Work::Work() 6 { 7 current=new ForenoonState; 8 Hour=9; 9 finish=false; 10 } 11 12 Work::~Work() 13 { 14 if(current!=0) 15 delete current; 16 } 17 18 double Work::getHour() 19 { 20 return Hour; 21 } 22 void Work::setHour(double HOUR) 23 { 24 Hour=HOUR; 25 } 26 27 bool Work::getFinish() 28 { 29 return finish; 30 } 31 void Work::setFinish(bool FINISH) 32 { 33 finish=FINISH; 34 } 35 36 void Work::setState(State* s) 37 { 38 if(current!=0) 39 delete current; 40 41 current=s; 42 } 43 44 void Work::writeProgram() 45 { 46 current->writeProgram(this); 47 }
1 //main.cpp 2 #include <iostream> 3 #include <cstdlib> 4 #include "Work.h" 5 //#include "State.h" 6 7 using namespace std; 8 9 void main() 10 { 11 12 Work emergencyProjects; 13 emergencyProjects.setHour(9); 14 emergencyProjects.writeProgram(); 15 emergencyProjects.setHour(10); 16 emergencyProjects.writeProgram(); 17 emergencyProjects.setHour(12); 18 emergencyProjects.writeProgram(); 19 emergencyProjects.setHour(13); 20 emergencyProjects.writeProgram(); 21 emergencyProjects.setHour(14); 22 emergencyProjects.writeProgram(); 23 emergencyProjects.setHour(17); 24 emergencyProjects.writeProgram(); 25 emergencyProjects.setFinish(false); 26 emergencyProjects.setHour(19); 27 emergencyProjects.writeProgram(); 28 emergencyProjects.setHour(22); 29 emergencyProjects.writeProgram(); 30 system("pause"); 31 }