大话设计模式-状态模式

状态模式:

概念:当一个对象的内部状态改变时,允许改变其行为,这个对象看起来像是改变了其类。

状态模式主要解决的是当控制一个对象状态的转换条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。

应用场景:当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时。

 1 //State.h
 2 #ifndef STATE  
 3 #define STATE  
 4 extern class Work;
 5 class State
 6 {
 7 public:
 8     State(){};
 9     virtual void writeProgram(Work* w){};
10 };
11 class ForenoonState:public State
12 {
13 public:
14     void writeProgram(Work* w);
15 };
16 
17 class NoonState:public State
18 {
19 public:
20     void writeProgram(Work* w);
21 };
22 class AfternoonState:public State
23 {
24 public:
25     void writeProgram(Work* w);
26 };
27 class EveningState:public State
28 {
29 public:
30     void writeProgram(Work* w);
31 };
32 class SleepingState:public State
33 {
34 public:
35     void writeProgram(Work* w);
36 };  
37 class RestState:public State
38 {
39 public:
40     void writeProgram(Work* w);
41 };  
42 #endif  
 1 //State.cpp
 2 #include <iostream>  
 3 #include "State.h"  
 4 #include "Work.h"  
 5 
 6 using namespace std;  
 7 
 8 void ForenoonState::writeProgram(Work* w)  
 9 {  
10     if(w->getHour()<12)  
11     {  
12         cout<<"当前时间:"<<w->getHour()<<""<<"上午工作,精神百倍"<<endl;  
13     }  
14     else  
15     {  
16         w->setState(new NoonState);  
17         w->writeProgram();  
18     }  
19 }  
20 
21 void NoonState::writeProgram(Work* w)  
22 {  
23     if(w->getHour()<13)  
24     {  
25         cout<<"当前时间:"<<w->getHour()<<""<<"饿了,午饭;犯困,午休"<<endl;  
26     }  
27     else  
28     {  
29         w->setState(new AfternoonState);  
30         w->writeProgram();  
31     }  
32 }  
33 
34 void AfternoonState::writeProgram(Work* w)  
35 {  
36     if(w->getHour()<17)  
37         cout<<"当前时间:"<<w->getHour()<<""<<"下午状态还不错,继续努力"<<endl;  
38     else  
39     {  
40         w->setState(new EveningState);  
41         w->writeProgram();  
42     }  
43 }  
44 
45 void EveningState::writeProgram(Work* w)  
46 {  
47     if(w->getFinish())  
48     {  
49         w->setState(new RestState);  
50         w->writeProgram();  
51     }  
52     else  
53     {  
54         if(w->getHour()<21)  
55             cout<<"当前时间:"<<w->getHour()<<""<<"加班哦,疲惫至极"<<endl;  
56         else  
57         {  
58             w->setState(new SleepingState);  
59             w->writeProgram();  
60         }  
61     }  
62 }  
63 
64 void SleepingState::writeProgram(Work* w)  
65 {  
66     cout<<"当前时间:"<<w->getHour()<<""<<"不行了,睡着了"<<endl;  
67 }  
68 
69 void RestState::writeProgram(Work* w)  
70 {  
71     cout<<"当前时间:"<<w->getHour()<<""<<"下班回家了"<<endl;  
72 }  
 1 //Work.h
 2 #ifndef WORK  
 3 #define WORK  
 4 
 5 #include "State.h"  
 6 
 7 
 8 class Work  
 9 {  
10 private:  
11     State* current;  
12 
13     double Hour;  
14     bool finish;  
15 
16 public:  
17     Work();  
18     ~Work();  
19 
20     double getHour();  
21     void setHour(double HOUR);  
22 
23     bool getFinish();  
24     void setFinish(bool FINISH);  
25 
26     void setState(State* s);  
27 
28     void writeProgram();  
29 };  
30 
31 #endif  
 1 //Work.cpp
 2 #include "Work.h"  
 3 
 4 
 5 Work::Work()  
 6 {  
 7     current=new ForenoonState;  
 8     Hour=9;  
 9     finish=false;  
10 }  
11 
12 Work::~Work()  
13 {  
14     if(current!=0)  
15         delete current;  
16 }  
17 
18 double Work::getHour()  
19 {  
20     return Hour;  
21 }  
22 void Work::setHour(double HOUR)  
23 {  
24     Hour=HOUR;  
25 }  
26 
27 bool Work::getFinish()  
28 {  
29     return finish;  
30 }  
31 void Work::setFinish(bool FINISH)  
32 {  
33     finish=FINISH;  
34 }  
35 
36 void Work::setState(State* s)  
37 {  
38     if(current!=0)  
39         delete current;  
40 
41     current=s;  
42 }  
43 
44 void Work::writeProgram()  
45 {  
46     current->writeProgram(this);  
47 } 
 1 //main.cpp
 2 #include <iostream>  
 3 #include <cstdlib>  
 4 #include "Work.h"  
 5 //#include "State.h"  
 6 
 7 using namespace std;  
 8 
 9 void main()  
10 {
11 
12     Work emergencyProjects; 
13     emergencyProjects.setHour(9); 
14     emergencyProjects.writeProgram(); 
15     emergencyProjects.setHour(10);
16     emergencyProjects.writeProgram();
17     emergencyProjects.setHour(12);
18     emergencyProjects.writeProgram();
19     emergencyProjects.setHour(13);
20     emergencyProjects.writeProgram();
21     emergencyProjects.setHour(14);
22     emergencyProjects.writeProgram();
23     emergencyProjects.setHour(17);
24     emergencyProjects.writeProgram();
25     emergencyProjects.setFinish(false);
26     emergencyProjects.setHour(19);
27     emergencyProjects.writeProgram();
28     emergencyProjects.setHour(22);
29     emergencyProjects.writeProgram();
30     system("pause");  
31 }  

猜你喜欢

转载自www.cnblogs.com/zhangjxblog/p/8949415.html