设计模式之状态模式(C++实现)
2016-06-17 13:46
435 查看
状态模式:其实就是在条件表达式过于复杂的时候,把状态的判断情况转移到表示不同状态的一系列类中,可以把复杂的逻辑简化。
比如:现在有三个情况,在早上的时候工作状态比较好,下午要继续努力工作,晚上下班回家,就可以把这三个判断继承一个状态父类,分成三个子类去写,再用一个工作类维护初始的状态,这样在新加其他状态的时候,就不必去修改原来的类,实现了封闭-开发原则。
/**********************************************************************Work.h*************************************************************/
/**********************************************************************State.h*************************************************************/
/**********************************************************************StateA.h*************************************************************/
/**********************************************************************StateB.h*************************************************************/
/**********************************************************************StateC.h*************************************************************/
/**********************************************************************main.cpp*************************************************************/
比如:现在有三个情况,在早上的时候工作状态比较好,下午要继续努力工作,晚上下班回家,就可以把这三个判断继承一个状态父类,分成三个子类去写,再用一个工作类维护初始的状态,这样在新加其他状态的时候,就不必去修改原来的类,实现了封闭-开发原则。
/**********************************************************************Work.h*************************************************************/
#ifndef WORK_H #define WORK_H class State; class Work { State *state; int Hour; public: Work(); void SetHour(int); int GetHour(); void Handle(); }; #endif/**********************************************************************Work.cpp*************************************************************/
#include "Work.h" #include "StateA.h" Work::Work() { state = new StateA; } void Work::SetHour(int hour) { Hour = hour; } int Work::GetHour() { return Hour; } void Work::Handle() { state->Handle(this); }
/**********************************************************************State.h*************************************************************/
#ifndef STATE_H #define STATE_H #include <iostream> class Work; using namespace std; class State { protected: State * state; public: virtual void Handle(Work *) = 0; }; #endif
/**********************************************************************StateA.h*************************************************************/
#ifndef STATEA_H #define STATEA_H #include "State.h" #include "StateB.h" #include "Work.h" class StateA : public State { public: void Handle(Work * work) { if(work->GetHour()<=12) cout<<"早上工作状态很好"<<endl; else { state = new StateB; state->Handle(work); } }; }; #endif
/**********************************************************************StateB.h*************************************************************/
#ifndef STATEB_H #define STATEB_H #include "State.h" #include "StateC.h" #include "Work.h" class StateB : public State { public: void Handle(Work * work) { if(work->GetHour()>12 && work->GetHour() <17) cout<<"下午继续努力工作"<<endl; else { state = new StateC; state->Handle(work); } }; }; #endif
/**********************************************************************StateC.h*************************************************************/
#ifndef STATEC_H #define STATEC_H #include "State.h" class Work; class StateC : public State { public: void Handle(Work *work) { cout<<"下班回家咯"<<endl; }; }; #endif
/**********************************************************************main.cpp*************************************************************/
#include "StateC.h" #include "StateB.h" #include "State.h" #include "Work.h" int main() { Work *work = new Work; work->SetHour(10); work->Handle(); work->SetHour(15); work->Handle(); work->SetHour(18); work->Handle(); getchar(); return 0; }