1 //========================================== 2 //Context.h 3 //========================================== 4 #pragma once 5 6 class State; 7 class Context 8 { 9 public: 10 Context(State* pState); 11 ~Context(); 12 void Request(); 13 private: 14 void UpdateState(State* pState); 15 friend class ConcreteStateA; 16 friend class ConcreteStateB; 17 private: 18 State* m_pState; 19 }; 20 21 //========================================== 22 //Context.cpp 23 //========================================== 24 #include "Context.h" 25 #include 26 #include "State.h" 27 28 Context::Context(State* pState) 29 :m_pState(pState) 30 { 31 } 32 33 Context::~Context() 34 { 35 delete m_pState; 36 } 37 38 void Context::Request() 39 { 40 if (NULL != m_pState) 41 { 42 m_pState->Handle(this); 43 } 44 } 45 46 void Context::UpdateState(State* pState) 47 { 48 delete m_pState; 49 m_pState = pState; 50 } 51 52 //========================================== 53 //State.h 54 //========================================== 55 #pragma once 56 57 class Context; 58 class State 59 { 60 public: 61 virtual ~State(){} 62 virtual void Handle(Context* pContex) = 0; 63 }; 64 65 class ConcreteStateA : public State 66 { 67 public: 68 void Handle(Context* pContex); 69 }; 70 71 class ConcreteStateB : public State 72 { 73 public: 74 void Handle(Context* pContex); 75 }; 76 77 //========================================== 78 //State.cpp 79 //========================================== 80 #include "State.h" 81 #include 82 #include "Context.h" 83 using namespace std; 84 85 //处理、更新状态 86 void ConcreteStateA::Handle(Context* pContex) 87 { 88 cout<<"ConcreteStateA :: Handle"< UpdateState(new ConcreteStateB); 90 } 91 92 void ConcreteStateB::Handle(Context* pContex) 93 { 94 cout<<"ConcreteStateB :: Handle"< UpdateState(new ConcreteStateA); 96 } 97 98 //========================================== 99 //main.cpp100 //==========================================101 #include "Context.h"102 #include "State.h"103 104 int main()105 {106 State *pState = new ConcreteStateA();107 Context *pContext = new Context(pState);108 pContext->Request();109 pContext->Request();110 pContext->Request();111 112 delete pContext;113 114 return 0;115 }