设计模式—状态模式(十二)

来源:互联网 发布:个人数据融合模型 编辑:程序博客网 时间:2024/06/05 20:45

        软件领域中的设计模式的重要性不言而喻。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态。虽然知道这些特性的定义但是并没有做到真正的理解,这样特性有什么作用?用于什么场合中等等问题,带着疑问开始学习设计模式,主要参考《大话设计模式》和《设计模式:可复用面向对象软件的基础》两本书。

        状态模式(State):当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,可考虑用到状态模式。

        状态模式的优点与用处:

        将与特定状态相关的行为局部化,并且将不同的状态行为分割开来;就是将特定状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个ConcreteState中,所以通过定义新的子类可以很容易地增加新的状态和转换。状态模式通过把各种状态转移逻辑分布到State的子类之间,来减少耦合性;

什么时候考虑使用设计模式:当一个对象取决于它的状态,并且它必须在运行时刻根据状态改变他的行为时,他就可以考虑使用状态模式了。


#include <iostream>using namespace std;class Work;class State{public:virtual void WriteProgram(Work* w) = 0;};class Work{private:State* current;public:double hour;public:Work();void SetState(State* temp){current = temp;}void Writeprogram(){current->WriteProgram(this);}};class EvenState :public State{public:virtual void WriteProgram(Work* w){if ((w->hour) < 18)cout << "马上快下班了" << endl;elsecout << "是时候回家了" << endl;}};class NoonState : public State{public:virtual void WriteProgram(Work* w){if ((w->hour) < 14)cout << "目前还不困,在干一会" << endl;else{w->SetState(new EvenState());//重新设置状态w->Writeprogram();//重新调用Writeprogram()}}};class ForenoonState : public State{public:virtual void WriteProgram(Work* w){if ((w->hour)<12)cout << "上午的精神很好" << endl;else{w->SetState(new NoonState()); // 重新设置状态w->Writeprogram(); //重新调用Writeprogram()}}};Work::Work(){current = new ForenoonState();}//客户端:int main(){Work* mywork = new Work();mywork->hour = 9;mywork->Writeprogram();mywork->hour = 13;mywork->Writeprogram();mywork->hour = 15;mywork->Writeprogram();mywork->hour = 19;mywork->Writeprogram();return 0;}


原创粉丝点击