QtC++ 设计模式(五)——状态模式

状态模式

序言

设计模式只是一个抽象的设计模式方法,并不是一个固定使用的搭配,就算是普通switch语句,Map,乃至状态机都是状态模式的其中一种实现方法

状态模式看起来好像和策略模式差不多,主要是其的侧重点不一样:

  1. 状态模式:适用于当对象的行为取决于它的状态时,以及需要在运行时根据状态改变对象的行为时。
  2. 策略模式 :适用于当有多种算法需要实现,并且这些算法可以相互替换时,或者当算法的实现需要频繁变化时。
    .

理解

Employee持有State的父类接口,通过切换不同继承的State实体,运行统一实现的接口,即可根据当前Employee持有的State,运行因State不同的不同方法。

.

源码

State.h

cpp 复制代码
class State
{
public:
    /**
     * @brief 产出率计算
     * @return
     */
    virtual int yieldsCalculation() const = 0;
};

class HungerState : public State
{
public:
    virtual int yieldsCalculation() const;
};

class HappyState : public State
{
public:
    virtual int yieldsCalculation() const;
};

class GrievanceState : public State
{
public:
    virtual int yieldsCalculation() const;
};

State.cpp

cpp 复制代码
int HungerState::yieldsCalculation() const
{
    return 40;
}

int HappyState::yieldsCalculation() const
{
    return 120;
}

int GrievanceState::yieldsCalculation() const
{
    return 20;
}

.

Employee.h

cpp 复制代码
class Employee
{
public:
    Employee();
    
    void switchHungerState();
    
    void switchHappyState();
    
    void switchGrievanceState();

    int yieldsCalculation() const;

private:
    std::unique_ptr< State > m_state;
};

Employee.cpp

cpp 复制代码
Employee::Employee()
{

}

void Employee::switchHungerState()
{
    m_state.reset(new HungerState);
}

void Employee::switchHappyState()
{
    m_state.reset(new HappyState);
}

void Employee::switchGrievanceState()
{
    m_state.reset(new GrievanceState);
}

int Employee::yieldsCalculation() const
{
    if (m_state)
        return m_state->yieldsCalculation();
    else
        return 0;
}

.

使用地方:

cpp 复制代码
Employee ctx;
ctx.switchHungerState()
std::cout << "yields: " << ctx.yieldsCalculation() << std::endl;

ctx.switchHappyState();
std::cout << "yields: " << ctx.yieldsCalculation() << std::endl;

ctx.switchGrievanceState();
std::cout << "yields: " << ctx.yieldsCalculation() << std::endl;
相关推荐
拆房老料3 分钟前
DeepSeek Super-agent 架构解析:从单任务 Agent 到持续运行的任务系统
人工智能·设计模式·系统架构
繁星蓝雨39 分钟前
C++设计原理———多重继承(虚基类、菱形继承、委托、重命名、基类和成员初始化)
c++·委托·多重继承·mi·显式初始化列·虚基类·对象布局
旖旎夜光1 小时前
【C++ 基础入门】命名空间、输入输出、缺省参数与函数重载
开发语言·c++·笔记·学习
扶尔魔ocy2 小时前
【QT入门到晋级】用开源的自定义控件开发
c++·qt·自定义控件
akinggw3 小时前
libsherpacore - 基于 sherpa-onnx 的 C++ 语音交互静态库
c++·交互·语音识别
xiaoye-duck4 小时前
《C++ 项目:手写大模型接入 SDK》ChatGPT接口设计(中):全量响应实现和测试
网络·c++·语言模型·chatgpt
東隅已逝,桑榆非晚4 小时前
算法3.双指针法-快乐数
c++·笔记·学习·算法
eggwyw5 小时前
C++相交链表和反转链表详解
开发语言·c++
杜 硕5 小时前
从零开始的C++生活——第六讲——02
c++·算法·生活
工一木子5 小时前
设计模式与生活⑩:地铁没变,你换了个状态
设计模式