设计模式二十一:state(状态模式)——对象行为型模式

it2024-04-15  17

state(状态模式)——对象行为型模式

 

 

1.意图允许一个对象在其内部状态改变时改变他的行为,似乎修改了这个类。

 

 

2.别名状态对象(objects for states)

 

 

3.动机一旦类的状态改变,行为也会产生相应的改变

 

 

4.适用性一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。一个操作中含有庞大的多分支的条件语句,并且这些分支依赖于该对象的状态。这个状态通常用很多枚举量来表示。通常,有很多个操作包含这个相同的条件结构。state模式将每一个条件分支都放入一个独立的类黄总,使你可以根据对象自身的情况将对象的状态作为一个对象,这一个对象可以不依赖于其他对象而独立变化。

 

 

5.结构

参考:http://www.cnblogs.com/boyxiao/archive/2010/06/22/1762627.html

 

 

6.参与者context(环境)定义客户感兴趣的接口维护一个concreteState的子类的实例,这个实例定义当天的状态state(状态)定义一个接口封装与context的一个特定状态相关的行为。concreteState subclass(具体状态子类)每一个子类实现一个与context的一个状态相关的行为。

 

 

7.协作context将与状态相关的请求委托给当前的concreteState对象处理context可将自身作为一个参数传递给处理该请求的状态对象,这使得状态对象在必要时可以访问contextcontext是客户使用的主要接口。客户可用状态对象来配置一个context,一旦一个context配置完毕,他的客户就不在需要直接与状态对象打交道。context或concreteState子类都可以决定哪个状态是另外哪一个的后继者,以及在何种状态下进行状态转换。

 

 

8.效果1)他将与特定状态相关的行为局部化,并且将不同的状态的行为分割开来。state模式将所有与一个特定状态相关的行为都放入一个对象中。另一个方法是使用数据值定义内部状态并且让context操作来显示的检查这些数据。但这样会使整个实现中遍布跳转语句。难以增加一个状态。2)使得状态转换更显式化。引入独立对象使得状态改变更加明确3)state状态可以被共享

 

 

9.实现1)谁定义状态转换如果状态转换的准则是固定的,那么他们可以在context中完全实现。2)基于表的另一种方法使用表将输入映射到状态转换3)创建和销毁state对象4)使用动态继承

 

 

10.代码示例

#include<iostream> using namespace std; class programmer; class state; class eating; class full; class programmer { public: programmer(state *st) { s = st; } void setState(state *st) { s = st; } void handle(); private: state *s; }; class state { public: virtual void coding(programmer *p){}; }; class hungry:public state { public: void coding(programmer *p); }; class eating:public state { public: void coding(programmer *p); }; class full:public state { public: void coding(programmer *p); }; void programmer::handle() { s->coding(this); } void hungry::coding(programmer *p) { cout<<"too hungry, can't coding any more"<<endl; p->setState(new eating()); } void eating::coding(programmer *p) { cout<<"I'm eating, forget about coding"<<endl; p->setState(new full()); } void full::coding(programmer *p) { cout<<"I'm full, take a moment"<<endl; p->setState(new hungry()); } int main() { state *hun = new hungry(); state *eat = new eating(); state *f = new full(); programmer *p = new programmer(hun); p->handle(); p->handle(); p->handle(); p->handle(); p->handle(); p->handle(); }

 

 

11.相关模式flyweight共享状态对象状态对象通常是单子模式

 

 

转载于:https://www.cnblogs.com/w0w0/archive/2012/05/22/2513828.html

最新回复(0)