大话设计模式C++实现-第16章-状态模式

2015-01-27 06:20:24 · 作者: · 浏览: 12

一、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++中两个类互相引用的解决方法