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. 好用的ajax后台框架

    dwz 简单实用的国产jquery Ui框架 http://www.j-ui.com/#_blank

  2. Bzoj 1532: [POI2005]Kos-Dicing 二分,网络流

    1532: [POI2005]Kos-Dicing Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1373  Solved: 444[Submit][St ...

  3. Java web.xml加载顺序

     web.xml加载过程(步骤): 1.启动WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点:   <listener></listener&g ...

  4. Does anyone successfully use USB drive in Windows7 guest?

    Hi, Does anyone successfully use USB drive in Windows7 guest? If I pass a USB drive to Windows7 gues ...

  5. Linux达人养成计划1(第2章 Linux系统安装)

    2.3 系统分区之分区与格式化 1. 分区类型 主分区:最多只能有四个. 扩展分区: 最多只能有1个. 主分区加扩展分区最多有4个. 不能写入数据,只能包含逻辑分区. 逻辑分区: 2. 格式化(高级格 ...

  6. CSS选择器详解(伪类) 转 http://blog.csdn.net/Panda_m/article/details/50084699

    CSS选择器详解 之 伪类 伪类对大小写不敏感 结构伪类选择器 结构伪类是CSS3新增的类型选择器,利用DOM树实现元素过滤,通过文档结构的相互关系来匹配元素,可以减少class和id属性的定义,使文 ...

  7. Linux编辑器的选择使用

    在执行 crontab -e的时候 发现编辑器不对 用的是nano 立刻 sudo select-editor 然后终端返回 Select an editor. To change later, ru ...

  8. Java整型与字符串相互转换(转)

    1如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([S ...

  9. JSP内置对象整理(转)

    ① out - javax.servlet.jsp.jspWriter out对象用于把结果输出到网页上. 方法: 1. void clear() ;清除输出缓冲区的内容,但是不输出到客户端. 2. ...

  10. Android自定义DataTimePicker(日期选择器)

    实现的效果就是在同一个布局上显示日期选择和时间选择,时间不准确bug修复 1.自定义类DateTimePickDialogUtil.java public class DateTimePickDial ...