作用:

允许一个对象在其内部状态改变时改变它的行为.

解析:

State模式主要解决的是在开发中时常遇到的根据不同的状态需要进行不同的

处理操作的问题,而这样的问题,大部分人是采用switch-case语句进行处理的,

这样会造成一个问题:分支过多,而且如果加入一个新的状态就需要对原来的代

码进行编译.State模式采用了对这些不同的状态进行封装的方式处理这类问题,

当状态改变的时候进行处理然后再切换到另一种状态,也就是说把状态的切换责

任交给了具体的状态类去负责.同时,State模式和Strategy模式在图示上有很

多相似的地方,需要说明的是两者的思想都是一致的,只不过封装的东西不同:St

ate模式封装的是不同的状态,而Stategy模式封装的是不同的算法.

#ifndef STATE_H

#define STATE_H

class State;

class Context

{

public:

Context(State* pState);

~Context();

void Request();

void ChangeState(State *pState);

private:

State *m_pState;

};

class State

{

public:

virtual ~State(){}

virtual void Handle(Context* pContext) = 0;

};

class ConcreateStateA

: public State

{

public:

void Handle(Context* pContext);

};

class ConcreateStateB

: public State

{

public:

void Handle(Context* pContext);

};

#endif

#include “State.h”

#include

Context::Context(State* pState)

: m_pState(pState)

{

}

Context::~Context()

{

delete m_pState;

m_pState = NULL;

}

void Context::Request()

{

if (NULL != m_pState)

{

m_pState->Handle(this);

}

}

void Context::ChangeState(State *pState)

{

if (NULL != m_pState)

{

delete m_pState;

m_pState = NULL;

}

m_pState = pState;

}

void ConcreateStateA::Handle(Context* pContext)

{

std::cout << “Handle by ConcreateStateA\n”;

if (NULL != pContext)

{

pContext->ChangeState(new ConcreateStateB());

}

}

void ConcreateStateB::Handle(Context* pContext)

{

std::cout << “Handle by ConcreateStateB\n”;

if (NULL != pContext)

{

pContext->ChangeState(new ConcreateStateA());

}

}

#include “State.h”

int main()

{

State *pState = new ConcreateStateA();

Context *pContext = new Context(pState);

pContext->Request();

pContext->Request();

pContext->Request();

delete pContext;

return 0;

}

c语言state用法,常见设计模式的解析和实现—State模式相关推荐

  1. c语言常见错误代码释义,C语言常见错误代码释义解析.doc

    C语言常见错误代码释义解析 C语言常见错误代码释义 错误代码及错误信息 错误释义error 1: Out of memory 内存溢出error 2: Identifier expected 缺标识符 ...

  2. 软件工程23种设计模式全解析

    23种设计模式全解析 一.设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代 ...

  3. 23种设计模式全解析

    longyulu的专栏 目录视图 摘要视图 订阅 [公告]博客系统优化升级     [收藏]Html5 精品资源汇集    博乐招募开始啦    id="cpro_u2392861_ifra ...

  4. Python语言学习之常见语句命令那些事:python和常见语句命令(条件语句、pass语句)使用方法之详细攻略

    Python语言学习之常见语句命令那些事:python和常见语句命令(条件语句.pass语句)使用方法之详细攻略 目录 Python常见语句命令 1.python的条件语句 2.Python之pass ...

  5. Android常见设计模式——代理模式(Proxy Pattern)(二)

    文章目录 1. 前言 2. 远程代理(Remote Proxy) 3. 后记 1. 前言 在上篇Android常见设计模式--代理模式(Proxy Pattern)中基本上知道了什么是代理模式,以及对 ...

  6. c语言指针用法及实际应用详解,通俗易懂超详细

    c语言指针用法及实际应用详解,通俗易懂超详细! \\\插播一条:文章末尾有惊喜哟~/// 今天给大家来讲解一下指针. 我会由浅到深,最后联合实际应用讲解,让大家学会指针的同时,知道大佬们都用指针来干嘛 ...

  7. C语言offsetof用法以及其扩展用法

    标题C语言offsetof用法以及其扩展用法 offsetof由于不是标准库的函数,所以得查一下,在stddef.h中,搜索一下编译器的这个头文件位置: 暴力一点,直接在根目录下搜索,find -na ...

  8. c语言反汇编过程,利用反汇编手段解析C语言函数

    [[技匠志]利用反汇编手段解析C语言函数]https://toutiao.com/group/6792908403560677900/?app=explore_article&timestam ...

  9. 转:YUV RGB 常见视频格式解析

    转: http://www.cnblogs.com/qinjunni/archive/2012/02/23/2364446.html YUV RGB 常见视频格式解析 I420是YUV格式的一种,而Y ...

最新文章

  1. sql语句中as的用法和作用
  2. BZOJ4825: [Hnoi2017]单旋(Splay)
  3. LeetCode MySQL 1077. 项目员工 III
  4. HTML5:去除IE10中输入框和密码框的X按钮和小眼睛
  5. 设计模式14_组合结构
  6. Atitit 项目成本之道 attilax著 1.1. 循环使用 效果明显 降低50%费用 1 1.2. Diy战略(效果显著)缩短供应链 自己组合使用,效率更高 2 1.3. 扎堆战略 使用广泛
  7. android 投屏原理图,什么是投屏功能,手机投屏原理介绍
  8. Hadoop安装教程(单机/伪分布式配置)
  9. Rational.Rose7.0系统软件
  10. POI dataFormat种类
  11. win7计算机管理员权限才能删除,手把手教你解决win7系统删除C盘文件需要管理员权限的图文办法...
  12. 学完后端还要学前端,在这之间还有中间件
  13. 微信小程序如何跳转到tabbar页面-陆大湿
  14. 在线教育凛冬将至!强敌环伺的尚德机构,能否突出重围?
  15. android锁屏密码文件夹,深入理解Android M 锁屏密码存储方式
  16. 杭电操作系统实验三--- 实现模拟shell(arm架构华为云)
  17. 美狐美颜SDK开源代码浅析
  18. 网易滑块识别-通用滑块识别
  19. 【设计模式-行为型-中介者模式(Mediator)】
  20. 在windows下编译erlang内建函数(nif)的dll文件

热门文章

  1. 三菱je -c中映射表的作用_linux内核页表映射机制:线性地址如何转为物理地址?...
  2. 关于ADC输入前级的抗混叠滤波器问题以及驱动负载电容的电阻值选择建议
  3. Python之print打印
  4. NET连接mysql字符串
  5. SCORM 基础知识
  6. 好用的第三方网站ios
  7. 路径中 斜杠/和反斜杠\ 的区别
  8. 3D和VR有关概念及原理整理;3D眼镜,3D视频,VR视频等
  9. c++system函数
  10. 对SingleTask和TaskAffinity的理解