设计模式之状态模式(State)
2013-07-05 19:28
141 查看
State模式的意图有2点:
1. 分散逻辑判断和处理。
对于State来说,无非就是状态的切换。说白了最终结果和switch/case差不多。对于少量的状态判断和逻辑处理,switch还行。但是对于一个较大的项目而且条件判断比较复杂,这个时候switch不仅效率低下,而且无法控制。State模式巧妙的将逻辑判断和处理放到状态对象中,而不是把条件判断和状态切换放在Context上下文中,从而分散了逻辑判断和处理。如果要更改逻辑,Context就不需要改动,只改动State类即可。
2. 去耦。我想这应该是Gof 设计模式的核心。
类图如下:
![](http://hi.csdn.net/attachment/201104/5/4758664_1301977080MaAa.jpg)
State模式中,将条件判断和状态切换放在State的派生类中。这样降低了Context逻辑判断的复杂和依赖,降低了耦合度。
注意:在一个状态对象要能切换到另一个状态对象,也就是new一个兄弟对象,按照下面的程序的意思在ForenoonState能new NoonState,达到状态切换的效果。(我个人的理解是这样的)
1. 分散逻辑判断和处理。
对于State来说,无非就是状态的切换。说白了最终结果和switch/case差不多。对于少量的状态判断和逻辑处理,switch还行。但是对于一个较大的项目而且条件判断比较复杂,这个时候switch不仅效率低下,而且无法控制。State模式巧妙的将逻辑判断和处理放到状态对象中,而不是把条件判断和状态切换放在Context上下文中,从而分散了逻辑判断和处理。如果要更改逻辑,Context就不需要改动,只改动State类即可。
2. 去耦。我想这应该是Gof 设计模式的核心。
类图如下:
![](http://hi.csdn.net/attachment/201104/5/4758664_1301977080MaAa.jpg)
State模式中,将条件判断和状态切换放在State的派生类中。这样降低了Context逻辑判断的复杂和依赖,降低了耦合度。
注意:在一个状态对象要能切换到另一个状态对象,也就是new一个兄弟对象,按照下面的程序的意思在ForenoonState能new NoonState,达到状态切换的效果。(我个人的理解是这样的)
#include <iostream> using namespace std; class Work; class ForenoonState; class NoonState; class State { public: virtual void WriteProgram(Work* w) = 0; }; class Work { public: Work(); void SetState(State* temp) { current = temp; } void WriteProgram() { current->WriteProgram(this); } double hour; private: State* current; }; class NoonState : public State { public: virtual void WriteProgram(Work* w) { if (w->hour < 13) cout << "NoonState OK" << endl; else cout << "NoonState Sleep" << endl; } }; class ForenoonState : public State { public: virtual void WriteProgram(Work* w) { if (w->hour < 12) cout << "ForenoonState OK" << endl; else { w->SetState(new NoonState()); w->WriteProgram(); } } }; Work::Work() { current = new ForenoonState(); } int main() { Work* myWork = new Work(); myWork->hour = 9; myWork->WriteProgram(); myWork->hour = 14; myWork->WriteProgram(); system("pause"); return 0; }
相关文章推荐
- C#面向对象模式设计第二十二讲:State 状态模式(行为型模式)
- Java设计模式——状态模式(State)
- 行为设计模式---状态模式(State)
- Java设计模式——状态模式(STATE PATTERN)
- 【设计模式】学习笔记14:状态模式(State)
- 设计模式系列6-----C++实现状态模式(State Pattern)
- 设计模式 ( 十七) 状态模式State(对象行为型)
- 设计模式之 State 状态模式
- 【JAVA】设计模式之状态模式(State模式)的使用分析
- 大熊君说说JS与设计模式之------状态模式State
- JAVA设计模式-状态模式-State-订单状态
- 设计模式之状态模式(state model)
- 讲故事学设计模式-状态(State)模式
- 【java设计模式之State(对应每种状态的行为) 】
- 设计模式----State(状态)模式
- 研磨设计模式 之 状态模式(State)1——跟着cc学设计系列
- [设计模式](十二):备忘录模式(Memento)|状态模式(State) - (两种类状态行为模式)
- 【设计模式 - 20】之状态模式(State)
- java设计模式-状态模式State
- 设计模式 - 状态模式(State)