带你深入浅出设计模式:九、状态模式:让对象随状态起舞

此为设计模式谈!

总-分-总的结构生活化的例子给你讲解设计模式!

码农不易,各位学者学到东西请点赞收藏支持支持!

开始部分:

总:状态模式的本质,根据状态来分离和选择行为。

分:

1、老规则,打开VS创建一个控制台应用

2、实现编码,这里以旅游出行的例子来辅助讲解状态模式

2.1 上下文(Context):拥有状态的对象

2.2 抽象状态类:定义了一个接口

2.3 具体状态类:步行、自行车、公交车

2.4 输出顺序“步行中”->“骑自行车中”->“乘坐公共交通中”

#include <iostream>
using namespace std;

// 状态接口
class TravelState {
public:
    virtual void Travel(Context* pContext) = 0;
};

// 上下文
class Context {
public:
    void Travel() {
        if (pState) {
            pState->Travel(this);
        }
    }

    void ChangeState(TravelState* p) {
        if (pState)
            delete pState;
        pState = p;
    }

private:
    TravelState* pState;
};

// 具体状态类
class WalkingState : public TravelState {
public:
    void Travel(Context* pContext) override {
        cout << "步行中..." << endl;
        // 假设在某些条件下,状态改变
        pContext->ChangeState(new BikeState());
    }
};

class BikeState : public TravelState {
public:
    void Travel(Context* pContext) override {
        cout << "骑自行车中..." << endl;
        // 状态改变
        pContext->ChangeState(new PublicTransportState());
    }
};

class PublicTransportState : public TravelState {
public:
    void Travel(Context* pContext) override {
        cout << "乘坐公共交通中..." << endl;
        // 状态改变
        pContext->ChangeState(new WalkingState());
    }
};

int main() {
    Context* pcontext = new Context(new WalkingState());
    for (int i = 0; i < 3; ++i) {
        pcontext->Travel();
        cout << endl;
    }
    return 0;
}

总:状态模式的优点:简化了应用逻辑的控制;更好地分离状态和行为。

缺点:一个状态对应一个状态处理类,让程序引入太多状态而变得混乱。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值