状态模式的C++实现示例

核心思想

状态模式(State Pattern) 是一种行为设计模式,允许对象在其内部状态改变时改变其行为。它将状态相关的逻辑分散到不同的状态类中,避免了使用大量的条件语句来处理不同状态下的行为。

状态抽象化 :将对象的状态抽象为独立的类,每个状态类实现与该状态相关的行为。
上下文委托 :上下文对象(Context)持有一个状态对象的引用,并将行为委托给当前状态对象。
状态切换:状态类负责在适当的时候切换到其他状态,上下文对象只需更新当前状态的引用。

使用场景

对象的行为依赖于它的状态,并且需要在运行时根据状态改变行为。

代码中包含大量与状态相关的条件分支,且这些分支在多个地方重复出现。

需要清晰地管理状态的转换逻辑,避免状态相关的代码分散在多个地方。

优点

消除条件分支 :将状态相关的逻辑分散到状态类中,避免了复杂的条件判断。
易于扩展 :新增状态时只需添加新的状态类,无需修改现有代码。
提高可读性:状态转换逻辑集中在状态类中,代码更清晰易懂。

缺点

类数量增加 :每个状态都需要一个类,可能会导致类的数量膨胀。
状态转换逻辑分散:状态转换逻辑分布在各个状态类中,可能会增加调试难度。

示例代码

cpp 复制代码
#include <iostream>
#include <memory>

// 前向声明
class State;

// 上下文类:电灯
class Light {
private:
    std::shared_ptr<State> state_; // 当前状态

public:
    Light(std::shared_ptr<State> state);

    void setState(std::shared_ptr<State> state); // 设置状态
    void pressSwitch(); // 按下开关
};

// 抽象状态类
class State {
public:
    virtual ~State() = default;
    virtual void handle(Light& light) = 0; // 处理行为
};

// 具体状态类:开状态
class OnState : public State {
public:
    void handle(Light& light) override;
};

// 具体状态类:关状态
class OffState : public State {
public:
    void handle(Light& light) override;
};

// Light 类的实现
Light::Light(std::shared_ptr<State> state) : state_(state) {}

void Light::setState(std::shared_ptr<State> state) {
    state_ = state;
}

void Light::pressSwitch() {
    state_->handle(*this); // 委托给当前状态处理
}

// OnState 类的实现
void OnState::handle(Light& light) {
    std::cout << "Turning light off." << std::endl;
    light.setState(std::make_shared<OffState>()); // 切换到关状态
}

// OffState 类的实现
void OffState::handle(Light& light) {
    std::cout << "Turning light on." << std::endl;
    light.setState(std::make_shared<OnState>()); // 切换到开状态
}

// 客户端代码
int main() {
    // 初始状态为关
    Light light(std::make_shared<OffState>());

    // 按下开关,切换状态
    light.pressSwitch(); // 开
    light.pressSwitch(); // 关
    light.pressSwitch(); // 开

    return 0;
}

输出结果

bash 复制代码
Turning light on.
Turning light off.
Turning light on.

代码解析

Light 类 :上下文类,持有一个状态对象的指针,并将行为委托给当前状态。
State 类 :抽象状态类,定义了状态的行为接口。
OnState 和 OffState 类 :具体状态类,实现了状态的行为和状态转换逻辑。
状态切换:在 handle 方法中,状态类负责切换到下一个状态。

相关推荐
WW_千谷山4_sch7 分钟前
MYOJ_10599:CSP初赛题单10:计算机网络
c++·计算机网络·算法
梵尔纳多41 分钟前
绘制一个矩形
c++·图形渲染·opengl
橘颂TA1 小时前
【剑斩OFFER】算法的暴力美学——leetCode 946 题:验证栈序列
c++·算法·leetcode·职场和发展·结构与算法
闻缺陷则喜何志丹1 小时前
【状态机动态规划】3686. 稳定子序列的数量|1969
c++·算法·动态规划·力扣·状态机动态规划
liulilittle1 小时前
OPENPPP2 网络驱动模式
开发语言·网络·c++·网络协议·信息与通信·通信
mjhcsp1 小时前
C++ AC 自动机:原理、实现与应用全解析
java·开发语言·c++·ac 自动机
茶本无香1 小时前
设计模式之二—原型模式:灵活的对象克隆机制
java·设计模式·原型模式
爱吃生蚝的于勒1 小时前
【Linux】进程间通信之匿名管道
linux·运维·服务器·c语言·数据结构·c++·vim
GISer_Jing1 小时前
Nano Banana+LoveArt三大核心功能解析:重构AI设计全链路,让创意落地更高效
人工智能·设计模式·aigc
wanderist.1 小时前
C++输入输出的一些问题
开发语言·c++·图论