

1 /////////context.cpp
2 #include "context.h"
3
4 void STContext::ChangeState(STState* pstState)
5 {
6 m_pstState = pstState;
7 }
8
9 void STContext::request()
10 {
11 m_pstState->Handle(this);
12 }
13 /////////// context.h
14 #ifndef _CONTEXT_H_
15 #define _CONTEXT_H_
16
17 #include <iostream>
18 #include <string>
19
20 #include "state.h"
21
22 using namespace std;
23
24
25 class STState;
26
27 class STContext
28 {
29 public:
30 void ChangeState(STState* pstState);
31 void request();
32
33 STState* m_pstState;
34 };
35
36 #endif
37
38
39 ///////////////////////////// state.cpp
40 #include "state.h"
41
42 void STConcreteStateA::Handle(STContext* pstContext)
43 {
44 cout<< "doing something in State A.\ndone, change state to State B"<< endl;
45 pstContext->ChangeState(new STConcreteStateB());
46 }
47
48 void STConcreteStateB::Handle(STContext* pstContext)
49 {
50 cout<< "doing something in State B.\ndone, change state to State C"<< endl;
51 pstContext->ChangeState(new STConcreteStateC());
52 }
53
54 void STConcreteStateC::Handle(STContext* pstContext)
55 {
56 cout<< "doing something in State C.\ndone."<< endl;
57 }
58
59 /////////////////////////////// state.h
60 #ifndef _STATE_H_
61 #define _STATE_H_
62 #include <iostream>
63 #include <string>
64
65 #include "context.h"
66
67 using namespace std;
68
69 class STContext;
70
71 class STState
72 {
73 public:
74 virtual void Handle(STContext*) = 0;
75 };
76
77 class STConcreteStateA: public STState
78 {
79 public:
80 virtual void Handle(STContext* pstContext);
81 };
82
83 class STConcreteStateB: public STState
84 {
85 public:
86 virtual void Handle(STContext* pstContext);
87 };
88
89 class STConcreteStateC: public STState
90 {
91 public:
92 virtual void Handle(STContext* pstContext);
93 };
94
95 #endif
96
97
98 ////////////////////// main.cpp
99 #include <iostream>
100 #include <string>
101
102 #include "state.h"
103 #include "context.h"
104
105 using namespace std;
106
107 int main(int argc, char* argv[])
108 {
109 STContext* pstContext = new STContext();
110
111 STState* pstStateA = new STConcreteStateA();
112
113 pstContext->ChangeState(pstStateA);
114 pstContext->request();
115 pstContext->request();
116
117 return 0;
118 }
119
120 /////////////////////
121 [wenchaozeng@devnet_10_10_tlinux_64 ~/learn_code/design_pattern/13_state]$ ./main
122 doing something in State A.
123 done, change state to State B
124 doing something in State B.
125 done, change state to State C