• 设计模式——状态模式(State)


    • 定义:允许一个对象在其状态改变时,改变它的行为。看起来对象似乎修改了它的类。
    • 解决根据不同的对象状态进行不同的操作的问题
    • UML

    • 代码示例:
        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 <stdio.h>
       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 <iostream>
       82 #include "Context.h"
       83 using namespace std;
       84 
       85 //处理、更新状态
       86 void ConcreteStateA::Handle(Context* pContex)
       87 {
       88     cout<<"ConcreteStateA :: Handle"<<endl;
       89     pContex->UpdateState(new ConcreteStateB);
       90 }
       91 
       92 void ConcreteStateB::Handle(Context* pContex)
       93 {
       94     cout<<"ConcreteStateB :: Handle"<<endl;
       95     pContex->UpdateState(new ConcreteStateA);
       96 }
       97 
       98 //==========================================
       99 //main.cpp
      100 //==========================================
      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 }
  • 相关阅读:
    SpringBoot 拦截器
    SpringBoot学习笔记1
    mysql学习1
    mybatis运行原理学习
    js学习2
    设计原则
    mybatis学习1
    spring mvc
    Jenkins流水线部署maven不同模块服务到不同服务器运行
    L2Dwidget让自己的vue项目骚起来
  • 原文地址:https://www.cnblogs.com/dahai/p/2843860.html
Copyright © 2020-2023  润新知