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. done, 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. done, 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. done."<< 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