21 【行为型】状态模式 - State

需求:
app扣除积分抽奖,奖品数量有限,抽完为止;
可以抽奖,不能抽奖,奖品发放,奖品领完

基本介绍:
1、状态模式(State):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
2、主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。当然,如果这个状态判断很简单,那就没必要用‘状态模式’了。”
3、本质是一种基于状态和事件的状态机;

原理类图:
/*
 * @Description: 
 * @Remark: 
 * @Author: whl
 * @博客园: https://www.cnblogs.com/cnwhl/
 * @Date: 2021-12-29 17:21:11
 * @LastEditTime: 2021-12-29 19:03:39
 */
#include <iostream>
using namespace std;

/**
 * @description: 抽象状态类
 * @Remark: 定义一个接口以封装与context的一个特定状态的相关行为
 */
class State
{
public:
    virtual void Handle(Context* pContext) = 0;
};

/**
 * @description: 具体状态类
 * @Remark: 每个子类实现一个与context的一个特定状态的相关行为
 */
class ConcreteStateA: public State
{
public:
    // 显示当前状态,并设置下个状态
    void Handle(Context* pContext){
        cout << "Current State is A" << endl;
        pContext->m_pState = new ConcreteStateB(); 
    }
};

class ConcreteStateB: public State
{
public:
    // 显示当前状态,并设置下个状态
    void Handle(Context* pContext){
        cout << "Current State is B" << endl;
        pContext->m_pState = new ConcreteStateC();      
    }
};

class ConcreteStateC: public State
{
public:
    // 显示当前状态,并设置下个状态
    void Handle(Context* pContext){
        cout << "Current State is C" << endl;
        pContext->m_pState = new ConcreteStateA(); 
    }
};

/**
 * @description: 上下文类
 * @Remark: 维护一个ConcreteState子类的实例,这个实例定义当前的状态
 */
class Context
{
public:
    Context(State* pState){
        m_pState = pState;
    }
    void Request(){
        m_pState->Handle(this);
    }
public:
    State* m_pState;
};

int main()
{
    ConcreteStateA* pA = new ConcreteStateA();
    Context* pContext = new Context(pA);

    pContext->Request();
    pContext->Request();
    pContext->Request();

    return 0;
}
应用:
借贷平台

注意事项和细节:
1、可维护性好,状态模式将每个状态的行为封装到对应的一个类中;
2、方便维护,符合开闭原则;
3、类比较多,每个状态一个类,加大维护难度;
4、当一个事件或者对象很多状态,状态之间相互转换,对不同的状态不同行为,可以考虑使用状态模式;
5、当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了








posted @ 2021-12-29 19:08  sfwhl  阅读(40)  评论(0)    收藏  举报