C++状态模式

状态模式

状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为。状态模式将对象的状态封装成不同的状态类,使得对象在不同状态下可以有不同的行为。这样可以减少大量的条件语句,并且使得状态转换更加灵活。
在状态模式中,有三个主要角色:
1、环境(Context):维护一个对抽象状态类的引用,可以动态地改变当前状态。
2、抽象状态类(State):定义一个接口,用于封装与环境的一个特定状态相关的行为。
3、具体状态类(ConcreteState):实现抽象状态类定义的接口,表示对象在特定状态下的行为。

使用场景:

1、对象的行为取决于其状态,并且需要在运行时根据状态改变行为。
2、有大量的条件语句来控制对象的行为,导致代码复杂且难以维护。
3、对象有多个状态且状态之间有转换关系。

优势:

1、将状态转换及相关行为封装到具体状态类中,使得状态转换更加清晰和简单。
2、每个状态类只关注自己的行为,符合单一职责原则。
3、可以方便地添加新的状态类,扩展性好。

劣势:

1、可能会导致类的数量增加,增加了系统复杂性。
2、如果状态转换比较复杂,可能会导致状态类之间的耦合增加。

Code

#include <iostream>
#include <memory>

// 状态基类
class State {
public:
    virtual void handle() = 0;
    virtual ~State() {}
};

// 具体状态类A
class ConcreteStateA : public State {
public:
    void handle() override {
        std::cout << "Handle in State A" << std::endl;
    }
};

// 具体状态类B
class ConcreteStateB : public State {
public:
    void handle() override {
        std::cout << "Handle in State B" << std::endl;
    }
};

// 环境类
class Context {
private:
    std::unique_ptr<State> state;

public:
    Context() : state(nullptr) {}

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

    void request() {
        if (state) {
            state->handle();
        }
    }
};

int main() {
    Context context;
    std::unique_ptr<State> stateA = std::make_unique<ConcreteStateA>();
    std::unique_ptr<State> stateB = std::make_unique<ConcreteStateB>();

    context.setState(std::move(stateA));
    context.request();

    context.setState(std::move(stateB));
    context.request();

    while (1);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值