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. Bzoj 3339: Rmq Problem && Bzoj 3585: mex 莫队,树状数组,二分

    3339: Rmq Problem Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 833  Solved: 397[Submit][Status][D ...

  2. 关于list 添加数据到指定下标

    1 2 3 4 5 6 7 8 9 10 11 12 protected <T> List<BusinessItemData> itemMap2ItemList(Map< ...

  3. Java String的== 与 equals小结

    package hashcode; public class LearnString { public static void main(String[] args) { //1.先在栈中创建一个对S ...

  4. 腾讯sdk配置

    android-mirror.bugly.qq.com

  5. 部署war包到tomcat服务器

    1.首先通过eclipse的maven install生成项目的war包 2.然后把war包解压到tomcat目录下的webapps目录下 3.然后运行tomcat下的bin目录下的startup.b ...

  6. Java开发常用代码

    1. 字符串有整型的相互转换 String a = String.valueOf(2); //integer to numeric string int i = Integer.parseInt(a) ...

  7. 动态的变量如何作为json的键

    定义一个json,然后设置键值,可是键本身也是变量 如何写呢? 按照以往的写法 var name="lizhaoyao"; var json={}; json.name=" ...

  8. 改变JVM中的参数以提高Eclipse的运行速度

    首先建立评估体系,将workspace里所有的项目close掉,关闭eclipse.优化的用例就是启动eclipse,open一个项目,eclipse会自动build这个项目,保证没有感觉到明显的卡, ...

  9. 半斤八两(创业兴家版 打工仔心声'98 Remix)

    创业兴家打工仔 刻苦工作热诚日夜维系天天专心向上依足正轨 结力好比兄弟努力一生打工仔 相亲相爱朋情日夜传递彼此一家那用分高与低 要互相多鼓励 半斤八两 莫记往昔的创伤半斤八两 面对春光应插秧半斤八两 ...

  10. BP神经网络基本原理

    2.1 BP神经网络基本原理 BP网络模型处理信息的基本原理是:输入信号Xi通过中间节点(隐层点)作用于输出节点,经过非线形变换,产生输出信号Yk,网络训练的每一个样本包含输入向量X和期望输出量t,网 ...