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学习笔记(十三)SharedPreference必须掌握的基础

    我们在开发中,应用程序会保存少量数据,例如一些字符串.一些标记或者一些配置文件,这时候如果去使用SQLite保存这些数据的话,难免会显得大材小用,用起来也不方便,对于这种信息,保存在SharedPre ...

  2. 特性扩展:WebActivatorEx

    WebActivator: PreApplicationStartMethod 属性,用于标记作为东西您获取 Web 应用程序启动时调用的方法,在Application_Start前. PostApp ...

  3. HTML5与CSS3权威指南.pdf1

    第2章 HTML5与HTML4的区别 HTML5的文件扩展符与内容类型保持不变仍为“.html”或“.htm”,内容类型(ContentType)仍为“text/html” DOCTYPE声明: HT ...

  4. 【解决】笔记本发射WiFi

    这个百度一下一大堆 .. 不过还是希望自己总结一发适合自己的 (*^__^*)  废话不多说,开始 基于几个bat (1)CreateWlan.bat netsh wlan set hostednet ...

  5. poj 2406 Power Strings【最小循环节】

    Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 36926   Accepted: 15254 D ...

  6. POJ 1113 Wall 凸包求周长

    Wall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 26286   Accepted: 8760 Description ...

  7. The server does not support version 3.1 of the JEE Web module specification.

    使用MyEclipse2015打开MyEclipse2014编辑的项目,在服务器Tomcat 7部署时,提示"The server does not support version 3.1 ...

  8. PAT 1076. Forwards on Weibo (30)

    Weibo is known as the Chinese version of Twitter. One user on Weibo may have many followers, and may ...

  9. Python抓取淘宝IP地址数据

    def fetch(ip): url = 'http://ip.taobao.com/service/getIpInfo.php?ip=' + ip result = [] try: response ...

  10. 草稿-Hyper-V

    Hyper-V Over SMB3.0 为Hyper-v宿主机和故障转移群集做防病毒排除 微软SMB 3.0文件共享协议新特性介绍