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

状态模式

序言

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

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

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

理解

Employee持有State的父类接口,通过切换不同继承的State实体,运行统一实现的接口,即可根据当前Employee持有的State,运行因State不同的不同方法。
在这里插入图片描述
.

源码

State.h

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

int HungerState::yieldsCalculation() const
{
    return 40;
}

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

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

.
Employee.h

class Employee
{
public:
    Employee();
    
    void switchHungerState();
    
    void switchHappyState();
    
    void switchGrievanceState();

    int yieldsCalculation() const;

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

Employee.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;
}

.
使用地方:

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;

相关推荐

  1. C++ QT设计模式状态模式

    2024-07-18 23:26:03       29 阅读
  2. 设计模式状态模式

    2024-07-18 23:26:03       55 阅读
  3. 设计模式——状态模式

    2024-07-18 23:26:03       53 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-18 23:26:03       70 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-18 23:26:03       74 阅读
  3. 在Django里面运行非项目文件

    2024-07-18 23:26:03       62 阅读
  4. Python语言-面向对象

    2024-07-18 23:26:03       72 阅读

热门阅读

  1. 信息系统项目管理师(高项)—学习笔记三

    2024-07-18 23:26:03       21 阅读
  2. linux修改文件夹下所有文件的权限(常用)

    2024-07-18 23:26:03       21 阅读
  3. c++类的继承详解

    2024-07-18 23:26:03       21 阅读
  4. 目标检测算法

    2024-07-18 23:26:03       23 阅读
  5. 有道云笔记 markdown 生成目录

    2024-07-18 23:26:03       25 阅读
  6. c/c++:多线程下调用exit接口函数的问题

    2024-07-18 23:26:03       21 阅读
  7. 国王(C++)

    2024-07-18 23:26:03       24 阅读
  8. @RequestBody接收到的参数中如何限制List的长度?

    2024-07-18 23:26:03       23 阅读
  9. QEMU源码全解析 —— CPU虚拟化(3)

    2024-07-18 23:26:03       25 阅读
  10. 爱心代码来啦!

    2024-07-18 23:26:03       30 阅读