行为设计模式之状态模式

文章目录

概述

定义

状态模式(state pattern)的定义: 允许一个对象在其内部状态改变时改变它的行为。 对象看起来似乎修改了它的类。

状态模式就是用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题.。状态模式将一个对象的状态从该对象中分离出来,封装到专门的状态类中(用类来表示状态) ,使得对象状态可以灵活变化。

结构图

  • 上下文信息类(Context):实际上就是存储当前状态的类,对外提供更新状态的操作。在该类中维护着一个抽象状态接口State实例,这个实例定义当前状态.

  • 抽象状态类(State):可以是一个接口或抽象类,用于定义声明状态更新的操作方法有哪些,具体实现由子类完成。

  • 具体状态类(StateA 等):实现抽象状态类定义的方法,根据具体的场景来指定对应状态改变后的代码实现逻辑。

2.代码示例

cpp 复制代码
// 抽象状态类
class State {
public:
    virtual void Handle(std::string input, std::shared_ptr<State> &currentState) = 0;
};

// 具体状态A
class StateA : public State {
public:
    void Handle(std::string input, std::shared_ptr<State> &currentState) override {
        if (input == "A") {
            std::cout << "StateA: Handle input A." << std::endl;
        } else if (input == "B") {
            std::cout << "StateA: Transition to StateB." << std::endl;
            currentState = std::make_shared<StateB>();
        } else {
            std::cout << "StateA: Invalid input." << std::endl;
        }
    }
};

// 具体状态B
class StateB : public State {
public:
    void Handle(std::string input, std::shared_ptr<State> &currentState) override {
        if (input == "B") {
            std::cout << "StateB: Handle input B." << std::endl;
        } else if (input == "C") {
            std::cout << "StateB: Transition to StateC." << std::endl;
            currentState = std::make_shared<StateC>();
        } else {
            std::cout << "StateB: Invalid input." << std::endl;
        }
    }
};

// 具体状态C
class StateC : public State {
public:
    void Handle(std::string input, std::shared_ptr<State> &currentState) override {
        if (input == "C") {
            std::cout << "StateC: Handle input C." << std::endl;
        } else if (input == "A") {
            std::cout << "StateC: Transition to StateA." << std::endl;
            currentState = std::make_shared<StateA>();
        } else {
            std::cout << "StateC: Invalid input." << std::endl;
        }
    }
};

// 上下文类,维护当前状态并执行请求
class Context {
private:
    std::shared_ptr<State> currentState;
public:
    Context(std::shared_ptr<State> initialState) : currentState(initialState) {}
    void Request(std::string input) {
        currentState->Handle(input, currentState);
    }
};

小结

这篇文章主要说了状态模式的定义,结构图,以及代码示例;这些都很常用的,不管是生活中,还是开发中,都是这样的。道理呢,往往很简单,看看代码示例,再想想现实生活,可能就理解了。OK,翻篇。

相关推荐
染指111034 分钟前
135.Agent-多Agent框架-LangChain多智能体(SubAgents子代理)
数据库·人工智能·设计模式·langchain·agent·agents
lank_M20 小时前
抠图换深色背景有白边?先分清直通和预乘alpha
图像处理·人工智能·计算机视觉·状态模式
弹简特21 小时前
【Java项目-企悦抽】17-抽奖模块02-抽奖接口实现
java·开发语言·状态模式·springboot
路弥行至1 天前
【Head First 设计模式】第 2 章:观察者模式 —— 用现代 C++ 重新解读“交互对象的松耦合
c++·经验分享·笔记·观察者模式·设计模式·入门教程·headfirst
YYYing.1 天前
【设计模式系列 (九) 】装饰器模式
c++·后端·设计模式·装饰器模式·c/c++
我是你的开心果7781 天前
ai全栈软件开发学习day27
人工智能·学习·状态模式
沫璃染墨1 天前
《从零入门Linux系统篇(五十六):线程篇·九——生产者消费者模型:从条件变量到BlockingQueue实现》
linux·服务器·c++·驱动开发·设计模式·架构·系统架构
弹简特2 天前
【Java项目-企悦抽】16-抽奖模块01-获取活动完整信息接口实现
java·开发语言·状态模式·springboot
c萱2 天前
AI产品经理——01基础认知篇
设计模式·prompt·aigc·产品经理·ai编程·gitcode·ai-native
YYYing.2 天前
【设计模式系列 (八) 】组合模式
c++·后端·设计模式·组合模式·c/c++