设计模式-状态模式

    xiaoxiao2021-04-14  31

    状态模式(State):当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类。

    状态模式主要用在:当控制一个对象状态变换的条件表达式过于复杂的情况,把状态的判断逻辑转移到表示不同状态的一系列类中,就可以把复杂的判断逻辑简化。 例子:一个员工在一天中根据时间不同或工作完成情况会有不同的状态,如果把这些状态全部写在一个类中,判断逻辑会很复杂。 UML:

    class Work; //抽象状态类 class State { public: virtual void DealWork(Work *work) {} }; //工作类 class Work { private: State *m_currentstate; int m_hours; public: Work(State *state) :m_currentstate(state), m_hours(0) {} void SetHours(int hours) { m_hours = hours; } int GetHours() { return m_hours; } void SetState(State *state) { delete m_currentstate; m_currentstate = state; } void DoWork() { m_currentstate->DealWork(this); } }; //具体状态:睡觉状态 class SleepState: public State{ public: void DealWork(Work *work) { cout << "现在是:" << work->GetHours() << "点 " << "睡觉时间" << endl; } }; //休息状态 class RestState :public State { public: void DealWork(Work *work) { if (work->GetHours() < 22) //判断状态,不在则设置为另一状态 { cout << "现在是:" << work->GetHours() << "点 " << "休息时间" << endl; } else { work->SetState(new SleepState()); //设置为另一状态 work->DoWork(); } } }; //工作状态 class JobState :public State { public: void DealWork(Work *work) { if (work->GetHours() < 17) { cout << "现在是:" << work->GetHours() << "点 " << "工作时间" << endl; } else { work->SetState(new RestState()); work->DoWork(); } } }; int main() { Work *work = new Work(new JobState()); work->SetHours(10); work->DoWork(); work->SetHours(20); work->DoWork(); work->SetHours(24); work->DoWork(); delete work; system("pause"); return 0; }

    这样写出来,感觉和职责链模式有点像。。。但是状态模式可以在不同情况下进入不同的状态,而职责链模式一般只有一个上级,相当于只有一条链,状态模式可以有多条。

    转载请注明原文地址: https://ju.6miu.com/read-669549.html

    最新回复(0)