设计模式之状态模式(c++实现)

状态模式是一种行为设计模式,它允许一个对象在其内部状态改变时改变其行为。换句话说,状态模式使得一个对象在其状态改变时能够表现出不同的行为。这种模式通常用于需要在运行时根据状态对行为进行不同处理的场景。

状态模式的核心是将状态相关的行为封装到不同的状态类中,从而使得状态的改变变得更加灵活且易于维护。

状态模式的结构

  1. Context(上下文):持有一个具体状态的引用,并定义客户端需要的接口。
  2. State(状态接口):定义一个接口以封装与一个特定状态相关的行为。
  3. ConcreteState(具体状态):实现状态接口,定义该状态下的具体行为。

C++ 实现示例

下面是一个简单的状态模式示例,用于实现一个简单的电梯系统。电梯有几个状态:运行、停止和故障。

#include <iostream>
#include <memory>

// 状态接口
class ElevatorState {
public:
    virtual void pressButton() = 0; // 按钮被按下的动作
    virtual ~ElevatorState() = default;
};

// 上下文类
class Elevator {
private:
    std::unique_ptr<ElevatorState> state;
public:
    Elevator(std::unique_ptr<ElevatorState> initialState) : state(std::move(initialState)) {}

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

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

// 具体状态类:运行状态
class RunningState : public ElevatorState {
public:
    void pressButton() override {
        std::cout << "电梯正在运行,按下按钮无效!" << std::endl;
    }
};

// 具体状态类:停止状态
class StoppedState : public ElevatorState {
public:
    void pressButton() override {
        std::cout << "电梯停止,开始运行..." << std::endl;
        // 切换状态
        // 假设我们这里有个上下文可以在实际代码中设置新的状态
    }
};

// 具体状态类:故障状态
class MalfunctionState : public ElevatorState {
public:
    void pressButton() override {
        std::cout << "电梯故障,无法响应按钮!" << std::endl;
    }
};

int main() {
    std::unique_ptr<Elevator> elevator = std::make_unique<Elevator>(std::make_unique<StoppedState>());

    elevator->pressButton(); // 电梯停止,开始运行...

    elevator->setState(std::make_unique<RunningState>());
    elevator->pressButton(); // 电梯正在运行,按下按钮无效!

    elevator->setState(std::make_unique<MalfunctionState>());
    elevator->pressButton(); // 电梯故障,无法响应按钮!

    return 0;
}

在这个示例中,我们创建了一个 Elevator 类作为上下文,持有状态对象的引用。根据不同的状态(运行、停止和故障),按下按钮的行为会有所不同。通过状态模式,我们可以轻松地添加新的状态,或者修改现有状态的行为,而不需要修改 Elevator 类的实现。这样使代码更加灵活和易于维护。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值