c++设计模式之状态模式

来源:互联网 发布:阿里云vps如何购买 编辑:程序博客网 时间:2024/05/16 06:29
[cpp] view plaincopyprint?
  1. /************************************************************************/
  2. /* 状态模式 */
  3. /************************************************************************/
  4. #include <IOSTREAM>
  5. using namespace std;
  6. /*
  7. 一个状态接口,不同的状态从该接口中继承出来,想要增加新的状态
  8. 时,只需从此接口中派生出新的类即可,适合于当判断较多(多个状态切换频繁)的场合
  9. 这里引入一个程序员写工程程序的例子,程序员在一天的不同时间会处于不同的状态
  10. 如果程序写不完还得加班,即程序员的状态会随着时间发生改变
  11. */
  12. class Work;
  13. /*状态接口State*/
  14. class State
  15. {
  16. public:
  17. virtual void WriteProgram(Work *w) = 0;//写程序的行为(与Work相关的行为)
  18. };
  19. //工作类
  20. class Work
  21. {
  22. private:
  23. State *current;//当前状态
  24. double hour;
  25. bool taskFinish;
  26. public:
  27. Work()
  28. {
  29. taskFinish = false;
  30. }
  31. void SetTime(double hour)
  32. {
  33. this->hour = hour;
  34. }
  35. double GetTime()
  36. {
  37. return this->hour;
  38. }
  39. //设置状态
  40. void SetState(State *s)
  41. {
  42. current = s;
  43. }
  44. //设置工程是否完成
  45. void SetFinish()
  46. {
  47. taskFinish = true;
  48. }
  49. bool GetFinish()
  50. {
  51. return taskFinish;
  52. }
  53. void WriteProgram()
  54. {
  55. current->WriteProgram(this);
  56. }
  57. };
  58. //下班休息状态
  59. class RestState :public State
  60. {
  61. public:
  62. void WriteProgram(Work *w)
  63. {
  64. cout<<"当前时间:"<<w->GetTime()<<"点 工作完成,下班回家了"<<endl;
  65. }
  66. };
  67. //睡眠工作状态
  68. class SleepingState :public State
  69. {
  70. public:
  71. void WriteProgram(Work *w)
  72. {
  73. cout<<"受不了了,"<<w->GetTime()<<"点了,先睡吧"<<endl;
  74. }
  75. };
  76. //晚上工作状态
  77. class EveningState : public State
  78. {
  79. public:
  80. void WriteProgram(Work *w)
  81. {
  82. //任务完成了,可以休息了
  83. if(w->GetFinish())
  84. {
  85. w->SetState(new RestState());
  86. w->WriteProgram();
  87. }else
  88. {
  89. if(w->GetTime()<21){
  90. cout<<"当前时间:"<<w->GetTime()<<"点 加班了,疲惫至极"<<endl;
  91. }else
  92. {
  93. //找过21点
  94. w->SetState(new SleepingState());
  95. w->WriteProgram();
  96. }
  97. }
  98. }
  99. };
  100. //下午工作状态
  101. class AfternoonState : public State
  102. {
  103. public:
  104. void WriteProgram(Work *w)
  105. {
  106. if(w->GetTime()<17)
  107. {
  108. cout<<"当前时间:"<<w->GetTime()<<"点 状态还不错,继续努力"<<endl;
  109. }else
  110. {
  111. w->SetState(new EveningState());
  112. w->WriteProgram();
  113. }
  114. }
  115. };
  116. //中午工作状态
  117. class NoonState :public State
  118. {
  119. public:
  120. void WriteProgram(Work *w)
  121. {
  122. if (w->GetTime()<13)
  123. cout<<"当前时间:"<<w->GetTime()<<"点 饿了,午饭:犯困,午休"<<endl;
  124. else
  125. {
  126. w->SetState(new AfternoonState());
  127. w->WriteProgram();
  128. }
  129. }
  130. };
  131. //上午工作状态
  132. class ForenoonState :public State
  133. {
  134. public:
  135. void WriteProgram(Work *w)
  136. {
  137. if(w->GetTime()<12)
  138. cout<<"当前时间:"<<w->GetTime()<<"点 上午工作,精神百倍"<<endl;
  139. else
  140. {
  141. w->SetState(new NoonState());
  142. w->WriteProgram();
  143. }
  144. }
  145. };
  146. void main()
  147. {
  148. //紧急项目
  149. Work *emergencyProjects = new Work();
  150. emergencyProjects->SetState(new ForenoonState());
  151. emergencyProjects->SetTime(9);
  152. emergencyProjects->WriteProgram();
  153. emergencyProjects->SetTime(10);
  154. emergencyProjects->WriteProgram();
  155. emergencyProjects->SetTime(12);
  156. emergencyProjects->WriteProgram();
  157. emergencyProjects->SetTime(14);
  158. emergencyProjects->WriteProgram();
  159. //完成工作,不需要再加班了
  160. //emergencyProjects->SetFinish();
  161. emergencyProjects->SetTime(19);
  162. emergencyProjects->WriteProgram();
  163. emergencyProjects->SetTime(22);
  164. emergencyProjects->WriteProgram();
  165. }


原创粉丝点击