设计模式(8)-状态模式(关注状态之间的变化)
状态模式(State Pattern)是设计模式的一种,属于行为模式。
定义(源于Design Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。
意图:允许一个对象在其内部状态改变时改变它的行为
适用场景:
1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
2.一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态。
类图结构:
这样的话让程序更加面向对象
状态模式的好处是将与特定状态相关的行为局部化,并且将不同的状态行为分割开来。
目的就是消除庞大的分支语句,状态模式通过把各种状态转移逻辑分布到state的子类之间,
来减少相互间的依赖。
什么时候使用?
当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为时,就可以
考虑状态模式。
参考代码如下:
#ifndef _STATE_H_ #define _STATE_H_ #include <iostream> #include <string> using namespace std; class Work; class State{ public : virtual void writeProgram(Work* work) = 0; }; //12 before class ForenoonState : public State{ public : void writeProgram(Work* work); }; //12 ~ 13 middle class MoonState: public State{ public : void writeProgram(Work* work); }; //12 ~ 13 middle class AfterMoonState: public State{ public : void writeProgram(Work* work); }; //晚间 class EveningState: public State{ public : void writeProgram(Work* work); }; //休息 class RestState: public State{ public : void writeProgram(Work* work); }; //睡觉 class SleepingState: public State{ public : void writeProgram(Work* work); }; class Work{ private : State* m_current; int m_hour; bool m_finish; public : Work( void ):m_current(NULL),m_finish( false ),m_hour(0){ m_current = new ForenoonState(); } int getHour( void ){ return m_hour; } void setHour( const int hour){ m_hour = hour; } bool getIsFinished( void ){ return m_finish; } void setFinishFlag( const bool bFinished){ m_finish = bFinished; } void setState(State* state){ m_current = state; } void writeProgram(){ m_current->writeProgram( this ); } }; void ForenoonState::writeProgram(Work* work){ if (work->getHour()<12){ cout<< "当前时间:" <<work->getHour()<< "点 上午工作,精神百倍" <<endl; } else { work->setState( new MoonState()); work->writeProgram(); } } void MoonState::writeProgram(Work* work){ if (work->getHour()<13){ cout<< "当前时间:" <<work->getHour()<< "点 午休,得去吃饭了!" <<endl; } else { work->setState( new AfterMoonState()); //work->writeProgram(); } } void AfterMoonState::writeProgram(Work* work){ if (work->getHour()<17){ cout<< "当前时间:" <<work->getHour()<< "点 下午状态还可以,继续努力!" <<endl; } else { work->setState( new EveningState()); work->writeProgram(); } } void EveningState::writeProgram(Work* work){ if (work->getIsFinished()){ work->setState( new RestState()); work->writeProgram(); } else { if (work->getHour()<21){ cout<< "当前时间:" <<work->getHour()<< "点 加班啊,疲惫之极!" <<endl; } else { work->setState( new SleepingState()); work->writeProgram(); } } } void RestState::writeProgram(Work* work){ cout<< "当前时间:" <<work->getHour()<< "点 下班回家了!" <<endl; } void SleepingState::writeProgram(Work* work){ cout<< "当前时间:" <<work->getHour()<< "点 不行了睡着了!" <<endl; } #endif void main(){ Work* work = new Work(); work->setHour(9); work->writeProgram(); work->setHour(10); work->writeProgram(); work->setHour(12); work->writeProgram(); work->setHour(13); work->writeProgram(); work->setHour(14); work->writeProgram(); work->setHour(17); work->writeProgram(); work->setFinishFlag( false ); work->writeProgram(); work->setHour(19); work->writeProgram(); work->setHour(21); work->writeProgram(); } |
对于状态频繁变更需要考虑状态模式。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架