状态模式-设计模式

状态模式-设计模式
来自于《大话设计模式》
状态模式(State):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

UML 类图:
状态模式-设计模式_第1张图片

代码实现 C++:
  1  #include  < iostream >
  2  using   namespace  std;
  3 
  4  class  Work;
  5  class  State;
  6  double  getHour(Work *  w);
  7  void    setState(Work  *  w, State  *  s);
  8  bool    getFinish(Work *  w);
  9  void    WriteProgramOutside(Work  *  w);
 10 
 11  class  State
 12  {
 13  public :
 14       virtual   void  WriteProgram(Work  *  w)  =   0 ;
 15  };
 16 
 17  class  RestState :  public  State
 18  {
 19  public :
 20       virtual   void  WriteProgram(Work  *  w)
 21      {
 22          cout  <<   " 当前时间: "   <<  getHour(w)  <<   "  点下班回家了。 "   <<  endl;
 23      }
 24  };
 25 
 26  class  SleepingState :  public  State
 27  {
 28  public :
 29       virtual   void  WriteProgram(Work  *  w)
 30      {
 31          cout  <<   " 当前时间: "   <<  getHour(w)  <<   "  点不行了,睡着了。 "   <<  endl;
 32      }
 33  };
 34 
 35  class  EveningState :  public  State
 36  {
 37  public :
 38       virtual   void  WriteProgram(Work  *  w)
 39      {
 40           if  (getFinish(w))
 41          {
 42              setState(w, static_cast < State *> ( new  RestState));
 43              WriteProgramOutside(w);
 44          }
 45           else
 46          {
 47               if  (getHour(w)  <   21.0 )
 48              {
 49                  cout  <<   " 当前时间: "   <<  getHour(w)  <<   "  点 加班哦,疲惫之极。 "   <<  endl;
 50              }
 51               else
 52              {
 53                  setState(w,  new  SleepingState);
 54                  WriteProgramOutside(w);
 55              }
 56          }
 57      }
 58  };
 59 
 60  class  AfternoonState :  public  State
 61  {
 62  public :
 63       virtual   void  WriteProgram(Work  *  w)
 64      {
 65           if  (getHour(w)  <   17.0 )
 66          {
 67              cout  <<   " 当前时间: "   <<  getHour(w)  <<   "  点 下午状态还不错,继续努力。 "   <<  endl;
 68          }
 69           else
 70          {
 71              setState(w,  new  EveningState);
 72              WriteProgramOutside(w);
 73          }
 74      }
 75  };
 76 
 77  class  NoonState :  public  State
 78  {
 79  public :
 80       virtual   void  WriteProgram(Work  *  w)
 81      {
 82           if  (getHour(w)  <   13.0 )
 83          {
 84              cout  <<   " 当前时间: "   <<  getHour(w)  <<   "  点 饿了,午饭;犯困,午休。 "   <<  endl;
 85          }
 86           else
 87          {
 88              setState(w,  new  AfternoonState);
 89              WriteProgramOutside(w);
 90          }
 91      }
 92  };
 93 
 94  class  ForenoonState :  public  State
 95  {
 96  public :
 97       virtual   void  WriteProgram(Work *  w)
 98      {
 99           if  (getHour(w)  <   12.0 )
100          {
101              cout  <<   " 当前时间: "   <<  getHour(w)  <<   "  点 上午工作,精神百倍! "   <<  endl;
102          }
103           else
104          {
105              setState(w,  new  NoonState);
106              WriteProgramOutside(w);
107          }
108      }
109  };
110 
111  class  Work
112  {
113  private :
114      State  *  current;
115       double  hour;
116       bool  finish;
117  public :
118       double  getHour()
119      {
120           return  hour;
121      }
122       void  setHour( double  h)
123      {
124          hour  =  h;
125      }
126       bool  getFinish()
127      {
128           return  finish;
129      }
130       void  setFinsh( bool  f)
131      {
132          finish  =  f;
133      }
134       void  setState(State  *  w)
135      {
136          delete current;
137          current  =  w;
138      }
139       void  WriteProgram()
140      {
141          current -> WriteProgram( this );
142      }
143      Work()
144      {
145          current  =   new  ForenoonState;
146          finish  =   false ;
147      }
148       ~ Work()
149      {
150          delete current;
151      }
152  };
153 
154  double  getHour(Work  *  w)
155  {
156       return  w -> getHour();
157  }
158  void  setHour(Work  *  w,  double  h)
159  {
160      w -> setHour(h);
161  }
162  bool  getFinish(Work  *  w)
163  {
164       return  w -> getFinish();
165  }
166  void  setFinish(Work  *  w,  bool  f)
167  {
168      w -> setFinsh(f);
169  }
170  void  setState(Work  *  w, State  *  s)
171  {
172      w -> setState(s);
173  }
174 
175  void  WriteProgramOutside(Work  *  w)
176  {
177      w -> WriteProgram();
178  }
179 
180  int  main()
181  {
182      Work *  emergencyProjects  =   new  Work;
183      emergencyProjects -> setHour( 9.0 );
184      emergencyProjects -> WriteProgram();
185      emergencyProjects -> setHour( 10.0 );
186      emergencyProjects -> WriteProgram();
187      emergencyProjects -> setHour( 12.0 );
188      emergencyProjects -> WriteProgram();
189      emergencyProjects -> setHour( 13.0 );
190      emergencyProjects -> WriteProgram();
191      emergencyProjects -> setHour( 14.0 );
192      emergencyProjects -> WriteProgram();
193      emergencyProjects -> setHour( 17.0 );
194      emergencyProjects -> WriteProgram();
195 
196       //  emergencyProjects->setFinsh(true);
197      emergencyProjects -> setFinsh( false );
198 
199      emergencyProjects -> WriteProgram();
200      emergencyProjects -> setHour( 19.0 );
201      emergencyProjects -> WriteProgram();
202      emergencyProjects -> setHour( 22.0 );
203      emergencyProjects -> WriteProgram();
204 
205      delete emergencyProjects;
206       return   0 ;
207  }

你可能感兴趣的:(状态模式-设计模式)