博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式(8)-状态模式(关注状态之间的变化)
阅读量:6324 次
发布时间:2019-06-22

本文共 2908 字,大约阅读时间需要 9 分钟。

状态模式(State Pattern)是设计模式的一种,属于行为模式。
定义(源于Design Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。  状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。
意图:允许一个对象在其内部状态改变时改变它的行为
适用场景:  1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。

  2.一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态。

类图结构:

2011042011073018.jpg

这样的话让程序更加面向对象

状态模式的好处是将与特定状态相关的行为局部化,并且将不同的状态行为分割开来。

目的就是消除庞大的分支语句,状态模式通过把各种状态转移逻辑分布到state的子类之间,
来减少相互间的依赖。
什么时候使用?
当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为时,就可以
考虑状态模式。

参考代码如下:

#ifndef _STATE_H_#define _STATE_H_#include 
#include
using namespace std; class Work; class State{public: virtual void writeProgram(Work* work) = 0;};//12 beforeclass ForenoonState : public State{public: void writeProgram(Work* work);};//12 ~ 13 middleclass MoonState:public State{public: void writeProgram(Work* work);}; //12 ~ 13 middleclass 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<<"当前时间:"<
getHour()<<"点 上午工作,精神百倍"<
setState(new MoonState()); work->writeProgram(); }} void MoonState::writeProgram(Work* work){ if(work->getHour()<13){ cout<<"当前时间:"<
getHour()<<"点 午休,得去吃饭了!"<
setState(new AfterMoonState()); //work->writeProgram(); }} void AfterMoonState::writeProgram(Work* work){ if(work->getHour()<17){ cout<<"当前时间:"<
getHour()<<"点 下午状态还可以,继续努力!"<
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<<"当前时间:"<
getHour()<<"点 加班啊,疲惫之极!"<
setState(new SleepingState()); work->writeProgram(); } }} void RestState::writeProgram(Work* work){ cout<<"当前时间:"<
getHour()<<"点 下班回家了!"<
getHour()<<"点 不行了睡着了!"<
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();}
对于状态频繁变更需要考虑状态模式。

转载地址:http://ssqaa.baihongyu.com/

你可能感兴趣的文章
恢复低版本的FlashPlayer
查看>>
Opengl VS2008开发环境
查看>>
ylbtech-QQ(腾讯)-群空间-数据库设计
查看>>
面试书籍
查看>>
模式识别 - 处理多个演示样本研究(MIL)特点(matlab)
查看>>
lintcode :Remove Duplicates from Sorted Array II 删除排序数组中的重复数字 II
查看>>
CSS 简介
查看>>
atitit.短信 验证码 破解 v3 p34 识别 绕过 系统方案规划----业务相关方案 手机验证码 .doc...
查看>>
C# TextBox常用方法总结
查看>>
[android] 调用系统照相机和摄像机
查看>>
JDBC数据库编程常用接口(转)
查看>>
解析js中( ( ) { } ( ) )的含义
查看>>
劈荆斩棘:Gitlab 部署 CI 持续集成
查看>>
Mongodb后台daemon方式启动
查看>>
cp显示进度条
查看>>
Hadoop RPC
查看>>
SuperSpider——打造功能强大的爬虫利器
查看>>
MySql状态查看方法 MySql如何查看连接数和状态?
查看>>
memcached 安装
查看>>
Python与Redis的连接教程
查看>>