• 行为设计模式之状态模式


    概述

    定义

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

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

    结构图

    状态模式结构图

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

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

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

    2.代码示例

    // 抽象状态类
    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,翻篇。

  • 相关阅读:
    207. 课程表
    C和指针 第15章 输入/输出函数 15.10 格式化的行I/O
    JavaScript基础知识12——运算符:算数运算符,比较运算符
    计算机毕业设计Java校园疫情防控管理系统(源码+系统+mysql数据库+Lw文档)
    总结ES11—ES13新特性——提升开发效率
    保研考研机试攻略:第二章——入门经典(2)
    List接口(集合)
    uniapp瀑布流布局写法
    数据库事务的超级详细讲解,包括事务特性、事务隔离级别、MVCC(多版本并发控制)
    【数据集|COCO】COCO格式数据集制作与数据集参数计算
  • 原文地址:https://blog.csdn.net/Vjunjun/article/details/139280526