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;
相关推荐
moonquakeTT几秒前
C++:智能指针
开发语言·c++
Lenyiin3 分钟前
第 97 场周赛:公平的糖果交换、查找和替换模式、根据前序和后序遍历构造二叉树、子序列宽度之和
java·c++·python·leetcode·周赛·lenyiin
Clarence Liu6 分钟前
MacOS 在Trae IDE中构建现代C++开发环境:从新手到高效的完整指南
c++·ide·macos
chenyuhao202418 分钟前
Linux系统编程:多线程互斥以及死锁问题
linux·运维·服务器·c++·后端
快乐的划水a22 分钟前
站点回复管理系统
c++
im_AMBER23 分钟前
Leetcode 83 使数组平衡的最少移除数目中等相关标签 | 尽可能使字符串相等
数据结构·c++·笔记·学习·算法·leetcode
XFF不秃头23 分钟前
力扣刷题笔记-组合总和
c++·笔记·leetcode
xu_yule25 分钟前
算法基础(图论)—拓扑排序
c++·算法·动态规划·图论·拓扑排序·aov网
R&L_2018100127 分钟前
C++之constexpr 编译时计算
c++·c++新特性·c++ 新特性
我是华为OD~HR~栗栗呀31 分钟前
(华为od)21届-Python面经
java·前端·c++·python·华为od·华为·面试