/////////context.cpp
#include "context.h" void STContext::ChangeState(STState* pstState)
{
m_pstState = pstState;
} void STContext::request()
{
m_pstState->Handle(this);
}
/////////// context.h
#ifndef _CONTEXT_H_
#define _CONTEXT_H_ #include <iostream>
#include <string> #include "state.h" using namespace std; class STState; class STContext
{
public:
void ChangeState(STState* pstState);
void request(); STState* m_pstState;
}; #endif ///////////////////////////// state.cpp
#include "state.h" void STConcreteStateA::Handle(STContext* pstContext)
{
cout<< "doing something in State A.\ndone, change state to State B"<< endl;
pstContext->ChangeState(new STConcreteStateB());
} void STConcreteStateB::Handle(STContext* pstContext)
{
cout<< "doing something in State B.\ndone, change state to State C"<< endl;
pstContext->ChangeState(new STConcreteStateC());
} void STConcreteStateC::Handle(STContext* pstContext)
{
cout<< "doing something in State C.\ndone."<< endl;
} /////////////////////////////// state.h
#ifndef _STATE_H_
#define _STATE_H_
#include <iostream>
#include <string> #include "context.h" using namespace std; class STContext; class STState
{
public:
virtual void Handle(STContext*) = ;
}; class STConcreteStateA: public STState
{
public:
virtual void Handle(STContext* pstContext);
}; class STConcreteStateB: public STState
{
public:
virtual void Handle(STContext* pstContext);
}; class STConcreteStateC: public STState
{
public:
virtual void Handle(STContext* pstContext);
}; #endif ////////////////////// main.cpp
#include <iostream>
#include <string> #include "state.h"
#include "context.h" using namespace std; int main(int argc, char* argv[])
{
STContext* pstContext = new STContext(); STState* pstStateA = new STConcreteStateA(); pstContext->ChangeState(pstStateA);
pstContext->request();
pstContext->request(); return ;
} /////////////////////
[wenchaozeng@devnet_10_10_tlinux_64 ~/learn_code/design_pattern/13_state]$ ./main
doing something in State A.
done, change state to State B
doing something in State B.
done, change state to State C

设计模式——状态模式(C++实现)的更多相关文章

  1. 14. 星际争霸之php设计模式--状态模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  2. [Head First设计模式]生活中学设计模式——状态模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

  3. JAVA 设计模式 状态模式

    用途 状态模式 (State) 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式是一种行为型模式. 结构

  4. 深入浅出设计模式——状态模式(State Pattern)

    模式动机 在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态,这样的对象叫做有状态的 (stateful)对象,这样的对象状态是从事先定义好的一系列值中取出的.当一个这样的 ...

  5. C++设计模式——状态模式

    前言 在实际开发中,我们经常会遇到这种情况:一个对象有多种状态,在每一个状态下,都会有不同的行为.那么在代码中我们经常是这样实现的. typedef enum tagState { state, st ...

  6. C#设计模式--状态模式

    设计模式: 状态模式(State Pattern) 简单介绍: 在状态模式(State Pattern)中,类的行为是基于它的状态改变的.这种类型的设计模式属于行为型模式. 在状态模式中,我们创建表示 ...

  7. Java设计模式—状态模式

    状态模式又是一个比较难的设计模式 定义如下: 当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类. 个人理解:通俗的讲,状态模式就是状态的改变引起了行为的改变,但是,我们只能看到行为的 ...

  8. 设计模式-状态模式(State Pattern)

    本文由@呆代待殆原创,转载请注明出处:http://www.cnblogs.com/coffeeSS/ 状态模式简介 状态模式允许一个对象在其内部状态改变的时候改变它的行为,他的内部会存着好几种状态, ...

  9. JavaScript设计模式——状态模式

    状态和行为: 所谓对象的状态,通常指的就是对象实例的属性的值:而行为指的就是对象的功能,再具体点说,行为大多可以对应到方法上. 状态模式的功能就是分离状态的行为,通过维护状态的变化,来调用不同状态对应 ...

  10. C#设计模式——状态模式(State Pattern)

    一.概述在面向对象软件设计时,常常碰到某一个对象由于状态的不同而有不同的行为.如果用if else或是switch case等方法处理,对象操作及对象的状态就耦合在一起,碰到复杂的情况就会造成代码结构 ...

随机推荐

  1. java基础之继承(二)

    上篇我们介绍了java中的构造方法,了解了关键字this和super在继承中所起到的作用,this可以显式调用重载的构造方法,super可以显式的调用父类中的任意可见方法.了解方法重载和重写的区别,知 ...

  2. JMeter使用(Linux)

    JMeter是一个Java桌面应用程序,用户界面采用Swing Java Api实现,支持并发和多线程或者线程组的执行,对于配置负载测试和压力测试非常有用.Jmeter是开源.免安装的,只需要有jdk ...

  3. caffe︱深度学习参数调优杂记+caffe训练时的问题+dropout/batch Normalization

    一.深度学习中常用的调节参数 本节为笔者上课笔记(CDA深度学习实战课程第一期) 1.学习率 步长的选择:你走的距离长短,越短当然不会错过,但是耗时间.步长的选择比较麻烦.步长越小,越容易得到局部最优 ...

  4. l【linux】linux rpm包命名规范

    RPM包的一般格式为:name-version-arch.rpmname-version-arch.src.rpm name:软件包名称.version:带有主.次和修订的软件包版本.arch:硬件平 ...

  5. 基于busybox的Linux小系统制作 (initrd)

    我们有时候有需要在busybox基础上,制作linux,可是却不知道具体怎么做,这里将对基于busybox的linux小系统制作做出详细的步骤说明.准备环境:1.一个Redhat完整系统的虚拟机,本次 ...

  6. eclipse中添加Java代码注释模板

    eclipse中添加Java代码注释模板 1.Window->Preference->Java->Code Style->Code Template,进入注释编辑界面 2.文件 ...

  7. JavaScript解决select下拉框中的内容太长显示不全的问题

    JavaScript解决select下拉框中的内容太长显示不全的问题 1.说明 有些情况下,select下拉框的内容过长,导致部分看不见: 现在通过鼠标事件,让下拉框中的内容显示完全 2.实现源码 & ...

  8. 查找IFileSourceFilter上的Pin

    创建了IFileSourceFilter,可IFileSourceFilter好像不是从IBaseFilter继承来的,没有EnumPins,那应该怎么查找IFileSourceFilter上的pin ...

  9. TypeError: Error #1006: value 不是函数。

    1.错误原因 TypeError: Error #1006: value 不是函数. at BasicChart/dataFunc()[E:\Flash Builder\Map\src\BasicCh ...

  10. Vasya and Basketball CodeForces - 493C

    Vasya follows a basketball game and marks the distances from which each team makes a throw. He knows ...