Advertisement
Guest User

Untitled

a guest
Apr 10th, 2020
215
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.39 KB | None | 0 0
  1. #include<string>
  2. #include<iostream>
  3.  
  4. class State;
  5. class StateContext;
  6. class SolidState;
  7. class LiquidState;
  8. class GasState;
  9.  
  10.  
  11. class State
  12. {
  13.     std::string name;
  14. public:
  15.     State(const std::string& name) : name(name) {}
  16.     std::string GetName()
  17.     {
  18.         return name;
  19.     }
  20.     virtual void Freeze(StateContext*) = 0;
  21.     virtual void Heat(StateContext*) = 0;
  22. };
  23.  
  24. class StateContext
  25. {
  26. private:
  27.     State* state;
  28. public:
  29.     StateContext(State* state)
  30.         : state(state) {}
  31.  
  32.     void Freeze()
  33.     {
  34.         std::cout << "Freezing " << state->GetName() << "..." << std::endl;
  35.         state->Freeze(this);
  36.     }
  37.     void Heat()
  38.     {
  39.         std::cout << "Heating " << state->GetName() << "..." << std::endl;
  40.         state->Heat(this);
  41.     }
  42.  
  43.     void SetState(State* s)
  44.     {
  45.         std::cout << "Chaging state from " << state->GetName()
  46.                   << " to " << s->GetName() << "..." << std::endl;
  47.         state = s;
  48.     }    
  49.     State* GetState()
  50.     {
  51.         return state;
  52.     }
  53.  
  54.     ~StateContext()
  55.     {
  56.         delete state;
  57.     }
  58. };
  59.  
  60.  
  61. class SolidState : public State
  62. {
  63. public:
  64.     SolidState() : State("Solid") {}
  65.     virtual void Freeze(StateContext* state);
  66.     virtual void Heat(StateContext* state);
  67. };
  68. class LiquidState : public State
  69. {
  70. public:
  71.     LiquidState() : State("Liquid") {}
  72.     virtual void Freeze(StateContext* state);
  73.     virtual void Heat(StateContext* state);
  74. };
  75. class GasState : public State
  76. {
  77. public:
  78.     GasState() : State("Gas") {}
  79.     virtual void Freeze(StateContext* state);
  80.     virtual void Heat(StateContext* state);
  81. };
  82.  
  83. void SolidState::Freeze(StateContext* state)
  84. {
  85.     std::cout << "Nothing happens" << std::endl;
  86. }
  87. void SolidState::Heat(StateContext* state)
  88. {
  89.     state->SetState(new LiquidState());
  90. }
  91.  
  92. void LiquidState::Freeze(StateContext* state)
  93. {
  94.     state->SetState(new SolidState());
  95. }
  96. void LiquidState::Heat(StateContext* state)
  97. {
  98.     state->SetState(new GasState());
  99. }
  100.  
  101. void GasState::Freeze(StateContext* state)
  102. {
  103.     state->SetState(new LiquidState());
  104. }
  105. void GasState::Heat(StateContext* state)
  106. {
  107.     std::cout << "Nothing happens" << std::endl;
  108. }
  109.  
  110. void Test()
  111. {
  112.     StateContext* sc = new StateContext(new SolidState());
  113.     sc->Heat();
  114.     sc->Heat();
  115.     sc->Heat();
  116.     sc->Freeze();
  117.     sc->Freeze();
  118.     sc->Freeze();
  119. }
  120.  
  121.  
  122.  
  123. int main() {
  124.     Test();
  125. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement