简述
在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态,这样的对象叫做有状态的(
stateful
)对象,这样的对象状态是从事先定义好的一系列值中取出的。当一个这样的对象与外部事件产生互动时,其内部状态就会改变,从而使得系统的行为也随之发生变化。
定义
允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。其别名为状态对象(
Objects for States
),状态模式是一种对象行为型模式。
角色
Context:
环境类State:
抽象状态类ConcreteState:
具体状态类
场景
- 当对象的行为取决于其状态时,它必须在运行时根据该状态更改其行为
- 具有取决于对象状态的大型和多部分条件语句的操作
实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
//抽象状态类 class State { public: virtual ~State() { /*...*/ } virtual void handle() = 0; //... }; //具体状态类A class ConcreteStateA : public State { public: ~ConcreteStateA() { /*...*/ } void handle() { std::cout << "State A handled." << std::endl; } //... }; //具体抽象类B class ConcreteStateB : public State { public: ~ConcreteStateB() { /*...*/ } void handle() { std::cout << "State B handled." << std::endl; } //... }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
//环境类 class Context { public: Context() : state() { /*...*/ } ~Context() { delete state; } void setState(State * const s) { if (state) delete state; state = s; } void request() { state->handle(); } //... private: State * state; //... }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
auto main()->int { Context * context = new Context(); context->setState(new ConcreteStateA()); context->request(); context->setState(new ConcreteStateB()); context->request(); delete context; return 0; } |
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ 行为型:模板方法模式09/25
- ♥ 创建型:工厂方法模式08/25
- ♥ 创建型:单例模式05/16
- ♥ 结构型:桥接模式09/24
- ♥ 创建型:抽象工厂模式08/26
- ♥ 结构型:代理模式09/23