状态模式详解
一、引言
状态模式是一种行为设计模式,它允许对象在其内部状态改变时改变它的行为。对象看起来像是改变了它的类。
二、模式介绍
1. 定义
状态模式定义了一个接口,它允许向对象附加附加责任。客户端可以选择附加的责任,并且对象本身会知道如何将这些责任附加或去除。
2. 主要角色
- 环境角色(Context):环境角色通常定义了客户感兴趣的接口,并维护一个当前状态。环境角色通常是一个抽象类或者接口。
- 抽象状态(State):定义一个接口,用于封装环境对象的一个具体状态所对应的行为。
- 具体状态(Concrete State):实现抽象状态中的行为。
三、代码示例
// 环境角色
class Context {
public:
void setState(State* state) { this->state = state; }
void request() { state->handle(); }
private:
State* state;
};
// 抽象状态
class State {
public:
virtual void handle() const = 0;
};
// 具体状态A
class ConcreteStateA : public State {
public:
void handle() const override {
std::cout << "Handling request in state A." << std::endl;
}
};
// 具体状态B
class ConcreteStateB : public State {
public:
void handle() const override {
std::cout << "Handling request in state B." << std::endl;
}
};
int main() {
Context context;
State* stateA = new ConcreteStateA();
State* stateB = new ConcreteStateB();
context.setState(stateA);
context.request();
context.setState(stateB);
context.request();
return 0;
}
四、应用场景
状态模式适用于当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。例如,在一个游戏中,一个角色可能有不同的状态(如行走、奔跑、跳跃等),并且在不同的状态下,角色的行为是不一样的。
五、总结
状态模式允许对象在其内部状态改变时改变它的行为,这样可以避免使用大量的条件语句。同时,它也使得状态的转换更加清晰和有序。
六、参考资料
- [Design Patterns: Elements of Reusable Object-Oriented Software]
- [状态模式 - Wikipedia]