一、UML图

二、概述
下面是来自书本和网络的对状态模式的定义和分析:
<??http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+CqOoMaOp17TMrMSjyr3UytDtttTP89TaxNqyv9e0zKy4xLHkyrG4xLHky/y1xNDQzqqjrLbUz/O/tMbwwLS6w8/x0N64xMHLy/y1xMDgoaO/tMbwwLSjrNe0zKzEo8q9usPP8crHyfHNqLnjtPO63MD3uqYmIzIwMjg0O7XEoaqhqr7TyLvE3Lm7obDQ3rjE19TJ7bXEwOChsaOhPC9wPgo8cD4Ko6gyo6k8c3Ryb25nPsrK08Ozob6wo7pho6k8L3N0cm9uZz7XtMysxKPKvdb30qq94r72tcTKx7Wxv9jWxtK7uPa21M/z17TMrNequ7u1xMz1vP6x7bTvyr25/dPauLTU08qxtcTH6b/2oaOw0de0zKy1xMXQts/C37yt16rSxrW9se3KvrK7zazXtMystcTSu8+1wdDA4NbQo6y/ydLUsNG4tNTTtcTF0CC2z8LfvK288rWlu6+ho6OovPK1pcC0y7WjrL7Nysew0bj31tZpZiBlbHNlINeqseSzycHL0ru49rj2tcS+38zl17TMrKOs1K3AtGlmIGVsc2Ugw7/W1sfpv/bPwrXEstnX98/W1NrXqru7tb3By8SzuPa+38zl17TMrNbQo6kKPHN0cm9uZz5io6k8L3N0cm9uZz61sdK7uPa21M/z0NDOqsihvvbT2sv8tcTXtMyso6yyosfSy/yx2NDr1NrUy9DQyrG/zLj5vt3XtMysuMSx5Mv8tcTQ0M6qyrGjrL7Nv8nS1L+8wsfKudPD17TMrMSjyr3By6GjPC9wPgo8cD48c3Ryb25nPsj9oaK9x8mrPC9zdHJvbmc+PC9wPgo8cD48L3A+CjxwPgo8c3Ryb25nPqOoMaOpQ29udGV4dMDgo7o8L3N0cm9uZz7U2rjDwODE2rK/zqy7pNK7uPZDb25jcmV0ZVN0YXRl19PA4LXE0ru49sq1wP2jrNXiuPbKtcD9tqjS5bWxx7C1xNe0zKyhozwvcD4KPHA+CjxzdHJvbmc+o6gyo6lTdGF0ZcDgo7o8L3N0cm9uZz6z6c/z17TMrMDgo6y2qNLl0ru49iC907/a0tS34tew0+tDb250ZXh0tcTSu7j2zNi2qNe0zKzP4LnYtcTQ0M6qoaM8L3A+CjxwPgo8c3Ryb25nPqOoM6OpQ29uY3JldGVTdGF0ZUEsQ29uY3JldGVTdGF0ZULA4KO6PC9zdHJvbmc+vt/M5de0zKzA4KOsw7/Su7j219MgwODKtc/W0ru49tPrQ29udGV4dLXE0ru49te0zKzP4LnYtcTQ0M6qoaM8L3A+CjxwPjxzdHJvbmc+y8ShokMmIzQzOyYjNDM7yrXP1jwvc3Ryb25nPjwvcD4KPHA+PHN0cm9uZz6jqDGjqVN0YXRlLmg8L3N0cm9uZz6jqLPpz/PXtMyswOC6zb7fzOXXtMyswOC1xMn5w/e6zbao0uW2vNTaU3RhdGUuaLrNU3RhdGUuY3Bw1tCjqTwvcD4KPHA+PHByZSBjbGFzcz0="brush:java;">#ifndef STATE #define STATE //#include "Work.h" extern class Work; class State { public: State(){}; virtual void writeProgram(Work* w){}; }; class ForenoonState:public State { public: void writeProgram(Work* w); }; class NoonState:public State { public: void writeProgram(Work* w); }; class AfternoonState:public State { public: void writeProgram(Work* w); }; class EveningState:public State { public: void writeProgram(Work* w); }; class SleepingState:public State { public: void writeProgram(Work* w); }; class RestState:public State { public: void writeProgram(Work* w); }; #endif
(2)State.cpp
#include#include "State.h" #include "Work.h" using namespace std; void ForenoonState::writeProgram(Work* w) { if(w->getHour()<12) { cout<<"当前时间:"< getHour()<<"点 "<<"上午工作,精神百倍"< setState(s); w->writeProgram(); } } void NoonState::writeProgram(Work* w) { if(w->getHour()<13) { cout<<"当前时间:"< getHour()<<"点 "<<"饿了,午饭;犯困,午休"< setState(new AfternoonState); w->writeProgram(); } } void AfternoonState::writeProgram(Work* w) { if(w->getHour()<17) cout<<"当前时间:"< getHour()<<"点 "<<"下午状态还不错,继续努力"< setState(new EveningState); w->writeProgram(); } } void EveningState::writeProgram(Work* w) { if(w->getFinish()) { w->setState(new RestState); w->writeProgram(); } else { if(w->getHour()<21) cout<<"当前时间:"< getHour()<<"点 "<<"加班哦,疲惫至极"< setState(new SleepingState); w->writeProgram(); } } } void SleepingState::writeProgram(Work* w) { cout<<"当前时间:"< getHour()<<"点 "<<"不行了,睡着了"< getHour()<<"点 "<<"下班回家了"<
(3)Work.h(这里的Work就是状态模式中的Context)
#ifndef WORK #define WORK #include "State.h" class Work { private: State* current; double Hour; bool finish; public: Work(); double getHour(); void setHour(double HOUR); bool getFinish(); void setFinish(bool FINISH); void setState(State* s); void writeProgram(); }; #endif
(4)Work.cpp
#include "Work.h" Work::Work() { current=new ForenoonState; Hour=9; finish=false; } double Work::getHour() { return Hour; } void Work::setHour(double HOUR) { Hour=HOUR; } bool Work::getFinish() { return finish; } void Work::setFinish(bool FINISH) { finish=FINISH; } void Work::setState(State* s) { current=s; } void Work::writeProgram() { current->writeProgram(this); }
(5)main.cpp(客户端)
#include#include #include "Work.h" //#include "State.h" using namespace std; void main() { Work emergencyProjects; emergencyProjects.setHour(9); emergencyProjects.writeProgram(); emergencyProjects.setHour(10); emergencyProjects.writeProgram(); emergencyProjects.setHour(12); emergencyProjects.writeProgram(); emergencyProjects.setHour(13); emergencyProjects.writeProgram(); emergencyProjects.setHour(14); emergencyProjects.writeProgram(); emergencyProjects.setHour(17); emergencyProjects.writeProgram(); emergencyProjects.setFinish(false); emergencyProjects.setHour(19); emergencyProjects.writeProgram(); emergencyProjects.setHour(22); emergencyProjects.writeProgram(); system("pause"); }
注意:上面的代码会出现两个类相互调用的情况,请查看日志:C++中两个类互相引用的解决方法