《状态模式(极简c++)》

本文章属于专栏- 概述 - 《设计模式(极简c++版)》-CSDN博客


模式说明:

  • 方案:状态模式是一种行为设计模式,用于在对象的内部状态发生改变时改变其行为。它包括三个关键角色:上下文(Context)、抽象状态(State)、具体状态(ConcreteState)。上下文负责维护一个状态对象,并在需要时委托给具体状态对象执行行为。抽象状态定义了一个接口,用于封装特定状态下的行为。具体状态实现了抽象状态定义的接口,并定义了特定状态下的行为。
  • 优点:将状态转换的逻辑封装在状态类中,使得状态间的切换更加简单,避免了大量的条件语句。将相关行为组织在一起,增强了代码的可维护性和可扩展性。
  • 缺点:增加了类和对象的数量,可能会导致系统更加复杂。

本质思想: 状态模式的本质是将对象的状态抽象为一个独立的类,使得对象在不同状态下有不同的行为,并且能够动态地切换状态。

实践建议:在实际开发中,状态一般用一个变量表示就够了,很少会抽象成一个类。如果,状态需要多个变量表示,且此类状态有固定的方法,则可以使用状态模式。这里封装的是当前状态,以及状态附属的行为。另外,不管是"状态类"作为参数传给"上下文类"执行,还是"上下文类"传给"状态类"执行,没有本质的区别。

代码示例:

cpp 复制代码
#include <iostream>

// 抽象状态类
class State {
public:
    virtual void handle() = 0;
};

// 具体状态类
class ConcreteStateA : public State {
public:
    void handle() override {
        std::cout << "State A handled." << std::endl;
    }
};

class ConcreteStateB : public State {
public:
    void handle() override {
        std::cout << "State B handled." << std::endl;
    }
};

// 上下文类
class Context {
public:
    void setState(State* state) {
        state_ = state;
    }

    void request() {
        if (state_) {
            state_->handle();
        } else {
            std::cout << "No state set." << std::endl;
        }
    }

private:
    State* state_ = nullptr;
};

int main() {
    Context context;
    ConcreteStateA stateA;
    ConcreteStateB stateB;

    // 设置初始状态为 State A
    context.setState(&stateA);
    context.request(); // 输出:State A handled.

    // 切换状态为 State B
    context.setState(&stateB);
    context.request(); // 输出:State B handled.

    return 0;
}
相关推荐
梦星辰.7 分钟前
VSCode CUDA C++进行Linux远程开发
linux·c++·vscode
pan_junbiao15 分钟前
Spring框架的设计模式
java·spring·设计模式
天天摸鱼的java工程师24 分钟前
Redis 集群缓存不一致?这篇把坑给你挖明白了
后端
天天摸鱼的java工程师27 分钟前
Redis 除了做缓存还能干什么?
后端
AntBlack35 分钟前
Trae Agent :能提高开发效率的功能都值亲自体验一下
后端·ai编程·trae
whoarethenext1 小时前
C++ OpenCV 学习路线图
c++·opencv·学习
闻缺陷则喜何志丹1 小时前
【强连通分量 缩点 拓扑排序】P3387 【模板】缩点|普及+
c++·算法·拓扑排序·洛谷·强连通分量·缩点
hutaotaotao2 小时前
c++中的输入输出流(标准IO,文件IO,字符串IO)
c++·io·fstream·sstream·iostream
江梦寻2 小时前
MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
开发语言·后端·python·macos·架构·策略模式
AL流云。2 小时前
【优选算法】C++滑动窗口
数据结构·c++·算法