大话设计模式之状态模式

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

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

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

*/

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

相关推荐
李广坤11 小时前
状态模式(State Pattern)
设计模式
李广坤12 小时前
观察者模式(Observer Pattern)
设计模式
李广坤13 小时前
中介者模式(Mediator Pattern)
设计模式
李广坤13 小时前
迭代器模式(Iterator Pattern)
设计模式
李广坤14 小时前
解释器模式(Interpreter Pattern)
设计模式
阿无,16 小时前
java23种设计模式之前言
设计模式
Asort17 小时前
JavaScript设计模式(八):组合模式(Composite)——构建灵活可扩展的树形对象结构
前端·javascript·设计模式
数据智能老司机17 小时前
数据工程设计模式——数据基础
大数据·设计模式·架构
nightunderblackcat19 小时前
四大名著智能可视化推演平台
前端·网络·爬虫·python·状态模式
笨手笨脚の20 小时前
设计模式-代理模式
设计模式·代理模式·aop·动态代理·结构型设计模式