设计模式二十一:state(状态模式)——对象行为型模式
2012-05-22 20:45
721 查看
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可将自身作为一个参数传递给处理该请求的状态对象,这使得状态对象在必要时可以访问context
context是客户使用的主要接口。客户可用状态对象来配置一个context,一旦一个context配置完毕,他的客户就不在需要直接与状态对象打交道。
context或concreteState子类都可以决定哪个状态是另外哪一个的后继者,以及在何种状态下进行状态转换。
8.效果
1)他将与特定状态相关的行为局部化,并且将不同的状态的行为分割开来。
state模式将所有与一个特定状态相关的行为都放入一个对象中。
另一个方法是使用数据值定义内部状态并且让context操作来显示的检查这些数据。但这样会使整个实现中遍布跳转语句。难以增加一个状态。
2)使得状态转换更显式化。
引入独立对象使得状态改变更加明确
3)state状态可以被共享
9.实现
1)谁定义状态转换
如果状态转换的准则是固定的,那么他们可以在context中完全实现。
2)基于表的另一种方法
使用表将输入映射到状态转换
3)创建和销毁state对象
4)使用动态继承
10.代码示例
11.相关模式
flyweight共享状态对象
状态对象通常是单子模式
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可将自身作为一个参数传递给处理该请求的状态对象,这使得状态对象在必要时可以访问context
context是客户使用的主要接口。客户可用状态对象来配置一个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共享状态对象
状态对象通常是单子模式
相关文章推荐
- 设计模式 ( 十七) 状态模式State(对象行为型)
- 设计模式 ( 十七) 状态模式State(对象行为型)
- 设计模式 ( 十七) 状态模式State(对象行为型)
- 设计模式 ( 十七) 状态模式State(对象行为型)
- 设计模式 ( 十七) 状态模式State(对象行为型)
- 设计模式 ( 十七) 状态模式State(对象行为型)
- 设计模式 ( 十七) 状态模式State(对象行为型)
- 设计模式 ( 十七) 状态模式State(对象行为型)
- State状态设计模式(对象行为型)
- [导入]C#面向对象设计模式纵横谈(22):(行为型模式) State 状态模式.zip(6.24 MB)
- 设计模式 之 STATE(状态)实例 —对象行为型模式
- C#面向对象模式设计第二十二讲:State 状态模式(行为型模式)
- 设计模式二十二:state(状态模式)——对象行为型模式
- 设计模式 ( 十七) 状态模式State(对象行为型)
- 23种设计模式(20)_行为型_状态者模式(State Pattern)
- C++实现设计模式 - STATE(状态)—对象行为模式(第二十个)
- 设计模式深入学习--State 状态模式(行为型模式)
- 状态模式State(对象行为型)
- 设计模式(20)-行为型-状态模式(State)
- 设计模式19---设计模式之状态模式(State)(行为型)