大话设计模式之状态模式

状态模式是一种行为设计模式,它允许对象在其内部状态发生变化时改变其行为。在状态模式中,对象将其行为委托给当前状态对象,从而在不同的状态下执行不同的行为,而不必在对象自身的代码中包含大量的条件语句。

通常,状态模式包含以下几个关键角色:

  1. Context(上下文):持有一个状态对象的引用,可以设置当前状态,并在状态发生变化时通知当前状态对象执行相应的行为。

  2. State(状态):定义了一个接口或抽象类,用于封装与Context的一个特定状态相关的行为。

  3. ConcreteState(具体状态):实现了State接口或抽象类,在其中实现了与特定状态相关的行为。

状态模式的优点包括:

  • 将与状态相关的行为封装到不同的状态类中,使代码结构更清晰,易于维护和扩展。
  • 减少了条件语句的使用,提高了代码的可读性和可维护性。
  • 将状态转换逻辑集中在Context中,使得状态之间的切换更加简单。

但是,状态模式也有一些缺点,例如:

  • 增加了类的数量,可能会导致系统中存在大量的状态类,增加了系统的复杂性。
  • 在状态过多或状态转换逻辑复杂的情况下,可能会导致状态管理变得困难。

总的来说,状态模式适用于需要根据对象的内部状态改变其行为的情况,可以帮助提高代码的可维护性和灵活性。

cpp 复制代码
#include <iostream>
#include <memory>

// 抽象状态类
class ElevatorState {
public:
    virtual void open() = 0;
    virtual void close() = 0;
    virtual void run() = 0;
    virtual void stop() = 0;
};

// 具体状态类:打开状态
class OpenState : public ElevatorState {
public:
    void open() override {
        std::cout << "The elevator is already open." << std::endl;
    }

    void close() override {
        std::cout << "Closing the elevator door." << std::endl;
    }

    void run() override {
        std::cout << "Cannot run when the door is open." << std::endl;
    }

    void stop() override {
        std::cout << "Stopping the elevator." << std::endl;
    }
};

// 具体状态类:关闭状态
class CloseState : public ElevatorState {
public:
    void open() override {
        std::cout << "Opening the elevator door." << std::endl;
    }

    void close() override {
        std::cout << "The elevator door is already closed." << std::endl;
    }

    void run() override {
        std::cout << "Running the elevator." << std::endl;
    }

    void stop() override {
        std::cout << "Stopping the elevator." << std::endl;
    }
};

// 上下文类:电梯
class Elevator {
private:
    std::shared_ptr<ElevatorState> state;

public:
    Elevator() {
        // 初始状态为关闭状态
        state = std::make_shared<CloseState>();
    }

    void setState(std::shared_ptr<ElevatorState> newState) {
        state = newState;
    }

    void open() {
        state->open();
    }

    void close() {
        state->close();
    }

    void run() {
        state->run();
    }

    void stop() {
        state->stop();
    }
};

int main() {
    Elevator elevator;

    elevator.open();  // Opening the elevator door.
    elevator.close(); // Closing the elevator door.
    elevator.run();   // Running the elevator.
    elevator.stop();  // Stopping the elevator.

    return 0;
}

/*
在这个示例中,我们首先定义了一个抽象状态类 ElevatorState,包含了四个虚函数,
分别代表电梯的四种状态:打开、关闭、运行和停止。然后定义了两个具体状态类 OpenState 和 CloseState,
分别代表电梯的打开和关闭状态,并实现了抽象状态类中的四个虚函数。

接着定义了一个上下文类 Elevator,表示电梯对象,其中包含一个状态对象的引用,
并提供了一系列操作电梯的方法,这些方法在运行时会根据电梯的当前状态委托给状态对象来执行相应的行为。

在 main 函数中,我们创建了一个电梯对象,并通过调用其各种方法来模拟电梯的操作。
在每次操作时,根据当前状态的不同,电梯会表现出不同的行为,这正是状态模式的作用所在。

*/

觉得有帮助的话,打赏一下呗。。

相关推荐
2401_868534787 小时前
长远目标 Long-term Goal 老题沿用
设计模式·需求分析
吃饱了得干活8 小时前
Java设计模式实战:一个支付模块的重构之旅,层层递进理解设计模式精髓
后端·设计模式·架构
你别说话了8 小时前
Vue3对接AI Agent: 封装流式对话组件
状态模式
vivo互联网技术11 小时前
软件不是从数据开始,而是从现实开始 | KDC 系列 01
设计模式·架构·领域驱动设计
码匠许师傅11 小时前
【设计模式精讲】27.模板方法模式(Template Method)
c++·设计模式·uml·模板方法模式
陈驰_050411 小时前
需求列表接口 422 Unprocessable Entity 排查与修复全记录
状态模式·fastapi·vue 3
码匠许师傅13 小时前
【设计模式精讲】28.访问者模式(Visitor)
java·设计模式·访问者模式
两点王爷1 天前
Java 与前端加载 MVT 数据:从服务端切片到浏览器渲染
java·前端·状态模式
码匠许师傅1 天前
【设计模式精讲】26.策略模式(Strategy)
c++·设计模式·策略模式·uml
Ysx1 天前
AI 问答不再"一本正经地胡说":30 轮提示词迭代,沉淀 4 条防幻觉铁律
设计模式