状态模式

来源:互联网 发布:mac如何u盘安装win7 编辑:程序博客网 时间:2024/06/05 18:44
[cpp] view plaincopy
  1. /************************************************************************/  
  2. /*                         状态模式                                     */  
  3. /************************************************************************/  
  4. #include <IOSTREAM>  
  5.   
  6.   
  7. using namespace std;  
  8.   
  9.   
  10.   
  11. /* 
  12.     一个状态接口,不同的状态从该接口中继承出来,想要增加新的状态 
  13.     时,只需从此接口中派生出新的类即可,适合于当判断较多(多个状态切换频繁)的场合 
  14.  
  15.  
  16.  
  17.     这里引入一个程序员写工程程序的例子,程序员在一天的不同时间会处于不同的状态 
  18.     如果程序写不完还得加班,即程序员的状态会随着时间发生改变 
  19. */  
  20. class Work;  
  21.   
  22. /*状态接口State*/  
  23. class State  
  24. {  
  25. public:  
  26.     virtual void WriteProgram(Work *w) = 0;//写程序的行为(与Work相关的行为)  
  27. };  
  28.   
  29.   
  30.   
  31. //工作类  
  32. class Work  
  33. {  
  34. private:  
  35.     State *current;//当前状态  
  36.     double hour;  
  37.     bool taskFinish;  
  38.       
  39.       
  40. public:  
  41.     Work()  
  42.     {  
  43.         taskFinish = false;  
  44.     }  
  45.   
  46.   
  47.     void SetTime(double hour)  
  48.     {  
  49.         this->hour = hour;  
  50.     }  
  51.   
  52.   
  53.     double GetTime()  
  54.     {  
  55.         return this->hour;  
  56.     }  
  57.       
  58.     //设置状态  
  59.     void SetState(State *s)  
  60.     {  
  61.         current = s;  
  62.     }  
  63.       
  64.     //设置工程是否完成  
  65.     void SetFinish()  
  66.     {  
  67.         taskFinish = true;  
  68.     }  
  69.   
  70.   
  71.   
  72.     bool GetFinish()  
  73.     {  
  74.         return taskFinish;  
  75.     }  
  76.       
  77.       
  78.     void WriteProgram()  
  79.     {  
  80.         current->WriteProgram(this);  
  81.     }  
  82.       
  83. };  
  84.   
  85.   
  86.   
  87.   
  88.   
  89.   
  90. //下班休息状态  
  91. class RestState : public State  
  92. {  
  93. public:  
  94.     void WriteProgram(Work *w)  
  95.     {  
  96.         cout<<"当前时间:"<<w->GetTime()<<"点 工作完成,下班回家了"<<endl;  
  97.     }  
  98.       
  99. };  
  100.   
  101.   
  102.   
  103.   
  104. //睡眠工作状态  
  105. class SleepingState : public State  
  106. {  
  107. public:  
  108.     void WriteProgram(Work *w)  
  109.     {  
  110.         cout<<"受不了了,"<<w->GetTime()<<"点了,先睡吧"<<endl;  
  111.     }  
  112.       
  113. };  
  114.   
  115.   
  116.   
  117. //晚上工作状态  
  118. class EveningState : public State  
  119. {  
  120. public:  
  121.     void WriteProgram(Work *w)  
  122.     {  
  123.         //任务完成了,可以休息了  
  124.         if(w->GetFinish())  
  125.         {  
  126.             w->SetState(new RestState());  
  127.             w->WriteProgram();  
  128.         }else  
  129.         {  
  130.             if(w->GetTime()<21){  
  131.                 cout<<"当前时间:"<<w->GetTime()<<"点 加班了,疲惫至极"<<endl;  
  132.             }else  
  133.             {  
  134.                 //找过21点  
  135.                 w->SetState(new SleepingState());  
  136.                 w->WriteProgram();  
  137.             }  
  138.         }  
  139.     }  
  140.       
  141. };  
  142.   
  143. //下午工作状态  
  144. class AfternoonState : public State  
  145. {  
  146.       
  147. public:  
  148.     void WriteProgram(Work *w)  
  149.     {  
  150.         if(w->GetTime()<17)  
  151.         {  
  152.             cout<<"当前时间:"<<w->GetTime()<<"点 状态还不错,继续努力"<<endl;  
  153.         }else  
  154.         {  
  155.             w->SetState(new EveningState());  
  156.             w->WriteProgram();  
  157.         }  
  158.     }  
  159. };  
  160.   
  161.   
  162. //中午工作状态  
  163. class NoonState : public State  
  164. {  
  165. public:  
  166.     void WriteProgram(Work *w)  
  167.     {  
  168.         if (w->GetTime()<13)  
  169.             cout<<"当前时间:"<<w->GetTime()<<"点 饿了,午饭:犯困,午休"<<endl;  
  170.         else  
  171.         {  
  172.             w->SetState(new AfternoonState());  
  173.             w->WriteProgram();  
  174.         }  
  175.     }  
  176.       
  177.       
  178. };  
  179.   
  180.   
  181.   
  182. //上午工作状态  
  183. class ForenoonState : public State  
  184. {  
  185. public:  
  186.     void WriteProgram(Work *w)  
  187.     {  
  188.         if(w->GetTime()<12)  
  189.             cout<<"当前时间:"<<w->GetTime()<<"点 上午工作,精神百倍"<<endl;  
  190.         else  
  191.         {  
  192.             w->SetState(new NoonState());  
  193.             w->WriteProgram();  
  194.         }  
  195.     }  
  196.   
  197.       
  198. };  
  199.   
  200.   
  201.   
  202.   
  203.   
  204.   
  205.   
  206.   
  207.   
  208.   
  209.   
  210.   
  211.   
  212.   
  213.   
  214.   
  215.   
  216.   
  217.   
  218.   
  219.   
  220.   
  221. void main()  
  222. {  
  223.     //紧急项目  
  224.     Work *emergencyProjects = new Work();  
  225.     emergencyProjects->SetState(new ForenoonState());  
  226.     emergencyProjects->SetTime(9);   
  227.     emergencyProjects->WriteProgram();  
  228.       
  229.   
  230.     emergencyProjects->SetTime(10);  
  231.     emergencyProjects->WriteProgram();  
  232.   
  233.     emergencyProjects->SetTime(12);  
  234.     emergencyProjects->WriteProgram();  
  235.   
  236.   
  237.     emergencyProjects->SetTime(14);  
  238.     emergencyProjects->WriteProgram();  
  239.   
  240.     //完成工作,不需要再加班了  
  241.     //emergencyProjects->SetFinish();  
  242.   
  243.       
  244.     emergencyProjects->SetTime(19);  
  245.     emergencyProjects->WriteProgram();  
  246.   
  247.     emergencyProjects->SetTime(22);  
  248.     emergencyProjects->WriteProgram();  
  249.   
  250. }  
0 0
原创粉丝点击