状态模式
状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为。状态模式将对象的状态封装成不同的状态类,使得对象在不同状态下可以有不同的行为。这样可以减少大量的条件语句,并且使得状态转换更加灵活。
在状态模式中,有三个主要角色:
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;
}