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;
相关推荐
珹洺几秒前
C++算法竞赛篇:DevC++ 如何进行debug调试
java·c++·算法
古月-一个C++方向的小白6 小时前
C++11之lambda表达式与包装器
开发语言·c++
tanyongxi668 小时前
C++ AVL树实现详解:平衡二叉搜索树的原理与代码实现
开发语言·c++
斯是 陋室10 小时前
在CentOS7.9服务器上安装.NET 8.0 SDK
运维·服务器·开发语言·c++·c#·云计算·.net
tju新生代魔迷11 小时前
C++:list
开发语言·c++
HHRL-yx11 小时前
C++网络编程 5.TCP套接字(socket)通信进阶-基于多线程的TCP多客户端通信
网络·c++·tcp/ip
tomato0912 小时前
河南萌新联赛2025第(一)场:河南工业大学(补题)
c++·算法
小飞悟13 小时前
一打开文章就弹登录框?我忍不了了!
前端·设计模式
Ares-Wang13 小时前
设计模式》》门面模式 适配器模式 区别
设计模式·适配器模式
不修×蝙蝠13 小时前
设计模式深度解析:单例、工厂、适配器与代理模式
单例模式·设计模式·代理模式·适配器模式·工厂