设计模式-状态模式
来源:互联网 发布:自学软件编程 编辑:程序博客网 时间:2024/06/01 18:51
状态模式(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;}
这样写出来,感觉和职责链模式有点像。。。但是状态模式可以在不同情况下进入不同的状态,而职责链模式一般只有一个上级,相当于只有一条链,状态模式可以有多条。
0 0
- 设计模式:状态模式
- 设计模式-----状态模式
- 设计模式 状态模式
- 设计模式 - 状态模式
- 设计模式---状态模式
- 设计模式-状态模式
- 设计模式:状态模式
- 设计模式 - 状态模式
- 设计模式-状态模式
- 设计模式--状态模式
- 设计模式-状态模式
- 设计模式:状态模式
- 设计模式-状态模式
- 设计模式-状态模式
- [设计模式]状态模式
- 设计模式 状态模式
- 设计模式--状态模式
- 设计模式--状态模式
- 机器学习之感知机学习笔记第一篇:求输入空间R中任意一点X0到超平面S的距离
- struts2框架校验文件配置提示The content of element type "validators" must match "(validator)+".
- DDS-正弦-Modelsim和MATLAB
- MTK6577+Android之Camera驱动) ~% d
- Binder学习笔记
- 设计模式-状态模式
- 用两个栈实现队列
- Pixhawk原生固件PX4之日期时间的确定
- Spring Aop解析自定义注解
- AJax基于JavaScript实现注册时局部判断用户名是否已被使用
- Android动画最新最全详解包含Material Design动画
- “定时炸弹”
- Spring学习-28:Spring中的事务管理之事务的回顾
- 注解的简单介绍以及自定义注解