State模式中我们将状态逻辑和动作实现进行分离。允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类;在一个状态即将结束的时候启用下一个状态。

 /////////state.h/////////////////////////////////////////////////////////////////
#pragma once
class Context ;
class State
{
public:
virtual ~State();
State();
virtual void OperationInterface(Context* ) = ;
virtual void OperationChangeState(Context* ) = ; protected:
bool ChangeState(Context* con , State* st);
private:
}; class ConcreteStateA : public State
{
public:
~ConcreteStateA();
ConcreteStateA();
void OperationInterface(Context* );
void OperationChangeState(Context* );
protected:
private:
}; class ConcreteStateB : public State
{
public:
~ConcreteStateB();
ConcreteStateB();
void OperationInterface(Context* );
void OperationChangeState(Context* );
protected:
private:
};
 ////////state.cpp//////////////////////////////////////////////////////////////////
#include "state.h"
#include "Context.h"
#include <iostream>
using namespace std;
State::~State()
{ }
State::State()
{ }
bool State::ChangeState(Context* con , State* st)
{
con->ChangeState(st);
return true ;
} ConcreteStateA::ConcreteStateA()
{ }
ConcreteStateA::~ConcreteStateA()
{ }
void ConcreteStateA::OperationInterface(Context* con)
{
cout<<"ConcreteStateA::OperationInterface......"<<endl;
} void ConcreteStateA::OperationChangeState(Context* con)
{
OperationInterface(con);
this->ChangeState(con , new ConcreteStateB());
} ConcreteStateB::~ConcreteStateB()
{ }
ConcreteStateB::ConcreteStateB()
{ }
void ConcreteStateB::OperationInterface(Context* con)
{
cout<<"ConcreteStateB::OperationInterface......"<<endl;
} void ConcreteStateB::OperationChangeState(Context* con)
{
OperationInterface(con);
this->ChangeState(con , new ConcreteStateA() );
}
 //////////////////Context.h////////////////////////////////////////////////////////
#pragma once
class State;
class Context
{
public:
~Context();
Context();
Context(State* st);
void OprationInterface();
void OperationChangState();
protected:
private:
friend class State ;
bool ChangeState(State* st);
State* _st ;
};
 /////////Context.cpp/////////////////////////////////////////////////////////////////
#include "Context.h"
#include "state.h"
Context::Context()
{ }
Context::Context(State* st)
{
_st = st ;
} bool Context::ChangeState(State* st)
{
_st = st ;
return true ;
}
Context::~Context()
{
delete _st ;
} void Context::OprationInterface()
{
_st->OperationChangeState(this) ;//主要此处,调用时改变为下一个状态。
} void Context::OperationChangState()
{
_st->OperationChangeState(this);
}
 ////////main.cpp//////////////////////////////////////////////////////////////////
#include "Context.h"
#include "state.h"
#include <iostream>
using namespace std;
int main()
{
State* st = new ConcreteStateA();
Context* con = new Context(st);
con->OprationInterface();
con->OprationInterface();
con->OprationInterface();
if (con)
{
delete con ;
}
if (st)
{
delete st ;
}
getchar();
return ;
}

State 模式在实现中,有两个关键点:
1)将 State 声明为 Context 的友元类(friend class) ,其作用是让 State 模式访问 Context 的 protected接口 ChangeSate() 。

2)State 及其子类中的操作都将 Context*传入作为参数,其主要目的是 State 类可以通过这个指针调用 Context中的方法 (在本示例代码中没有体现)。这也是 State 模式和 Strategy 模式的最大区别所在。

State 模式的更多相关文章

  1. 敏捷软件开发(1)--- STATE 模式

    如果状态在运行过程中,不停的切换和改变,我们怎么办? 状态的迁移是我们生活和工程中非常普遍的一个概念.于是在数学上有一种理论来分析和解决这个问题. 有限状态机理论是一个非常成熟的理论,所有动作和流程的 ...

  2. State模式的经典应用场景:订单处理(c#实现)

    State模式在对象内部状态发生变化的时候,改变自身的行为,这通常是通过切换内部状态对象实现的,对象将自身在各个状态的行为推给了状态对象,从而解开了行为与对象的依赖. 场景描述 在经典的订单处理场景中 ...

  3. 无聊之作,RPGdemo制作(一)角色state模式

    今天周末,在家无事可做,不知道为什么,突发奇想,想写一个RPG游戏的demo玩玩.所以就记录一下. 第一步要做的是,为以后的角色类写一个state模式的类,考虑到可能以后会用到,所以用模版来实现, / ...

  4. State模式

    地铁十字转门 状态迁移表格. 起始状态 触发迁移的事件 终止状态  要执行的动作. Locked   Coin               UnLocked UnLock UnLocked Pass  ...

  5. Behavioral模式State模式

    1.意向 同意一个目标,然后改变其内部状态,改变它的行为. 对象似乎改变它的类别. 2.别名 状态对象(Objects for States) 3.动机 考虑一个表示网络连接的类TCPConnecti ...

  6. 【行为型】State模式

    状态模式其意图是在一个对象的状态发生变化时能够同时改变它的行为.一个生活中比较常见的例子就如你(是指你自己本人)在走时时,整个人全身的动作是双手臂前后慢慢摇摆且双脚也是一步一步慢慢往前移的,即:该走路 ...

  7. state模式理解

    state模式应用场景 条件判断很多的情况 比如有很多if else语句:switch case语句等等. 如果以后业务越来越复杂,条件判断有100多个,每种条件的处理逻辑很复杂,不止一个业务逻辑会重 ...

  8. State模式学习笔记

    选用了一个假设需要用户验证的例子进行State模式学习,这个例子并不恰当.无所谓了,只要能学习到其中的内容即可. 适用性: 1,一个对象的行为取决于他的状态,并且它必须在运行时刻依据状态改变他的行为. ...

  9. java设计模式-State模式

    1.背景: MM的状态是非常不固定的,说不定刚才还非常高兴,没准一会就生气了.就跟六月的天似的,说变就变. 封装一下MM的状态:smile,cry,say:MM的状态决定了这些方法该怎么执行.   2 ...

随机推荐

  1. android camera(四):camera 驱动 GT2005

    摄像头主要参数: 1.MCLK  24MHz: 2.PCLK  48~52MHz~: 3.电压 1.8V(1.5V).2.8V: 4.scl(IIC时钟)100KHz或者400KHz. 下载:常用摄像 ...

  2. ambari的重新安装

    ambari是什么呢? 这里我简单说一下ambari的目的,他的目的就是简化hadoop集群的安装和管理.对于安装简化到什么地步呢?只需要几个命令,在页面上配置几个参数,几百几千个节点的集群就能安装成 ...

  3. forward和redirect 的区别

    一.使用区别 1.从地址栏显示来说 forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来 ...

  4. hdoj 1201 18岁生日

    18岁生日 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  5. DirectShow Filter 开发典型例子分析 ——字幕叠加 (FilterTitleOverlay)1

    本文分析一下<DirectShow开发指南>中的一个典型的Transform Filter的例子:字幕叠加(FilterTitleOverlay).通过分析该例子,我们可以学习到Direc ...

  6. poj 1193 内存分配

    好麻烦的模拟题,一次性过了就好!!!不过用了两天哦.. 小伙伴们慢慢做哦. #include <iostream> #include <list> #include <q ...

  7. HttpWebRequest抓数据遇到的问题

    1.有些网站访问速度慢,而且这个网站的连接数(比如全球内衣,另外对于女生各种什么内衣不懂的也可以上去查看了解哈),因为没有即时的关闭,造成抓取页面数据的时候超时也严重. 解决:把相应的HttpWebR ...

  8. CSS学习之盒子模式

    从CSS角度来看,页面上每个元素都是一个盒子,不管是块元素还是内敛元素等.而这个盒子由四个部分组成.内容区,补白,边框,边界,下面来介绍下这四种元素. 1 内容 每个元素都是以某些内容开始的,比如文本 ...

  9. Cocos2d-x 在缓存创建图片

    /* 加载图片资源到SpriteFrame缓存池*/     CCSpriteFrameCache *cache=CCSpriteFrameCache::sharedSpriteFrameCache( ...

  10. HTML里面Textarea换行总结

    近期碰到一个数据转来转去转到Textrea里面能否真正按行存放的问题,在这里总结一下:   问题描写叙述: 比方get数据到一个TextArea里面,如“AAA BBB”,想把这段文字在TextAre ...