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;
相关推荐
2301_811232982 分钟前
C++中的契约编程
开发语言·c++·算法
2401_829004023 分钟前
C++中的访问者模式
开发语言·c++·算法
D_evil__10 分钟前
【Effective Modern C++】第三章 转向现代C++:13. 优先选用const_iterator,而非iterator
c++
赵萱婷11 分钟前
C++17 nodiscard属性深度解析
开发语言·c++·经验分享
kklovecode12 分钟前
C++对C语言的增强
c语言·开发语言·c++
zihan032121 分钟前
element-plus, el-table 表头按照指定字段升降序的功能实现
前端·vue.js·状态模式
m0_7482486528 分钟前
C语言向C++过渡
c语言·c++·算法
qq_4232339041 分钟前
跨语言调用C++接口
开发语言·c++·算法