状态模式

定义:

允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。

实用性:

1、 一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。

2、 一个操作中含有庞大的多分支条件语句,且这些分支依赖于该对象的状态。

优点:

1、 将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。

2、 使得状态转换显示化。

3、 状态对象可以被共享。

结构:

实现:

class Context;

class State

{

public:

State(string name):m_name(name)

{ }

virtual void Handle(Context *pContext)

{ }

virtual~State()

{ }

string GetStateName()

{

returnm_name;

}

protected:

voidChangeState(Context *pContext,State *pState);

private:

string m_name;

};

class Context

{

public:

voidRequest()

{

m_pCurrentState->Handle(this);

}

voidSetCurrentState(State *pState)

{

cout<<"设置当前状态为 :"<GetStateName()<<endl;< p="">

m_pCurrentState = pState;

}

State *GetCurrentState()

{

cout<<"当前状态为 :"<<m_pcurrentstate->GetStateName()<<endl;< p="">

returnm_pCurrentState;

}

protected:

friend class State;

void ChangeState(State *pState)

{

cout<<"当前状态由 : "<<m_pcurrentstate->GetStateName()<<" 转变为状态:"<GetStateName()<<endl;< p="">

m_pCurrentState = pState;

}

private:

State *m_pCurrentState;

};

voidState::ChangeState(Context *pContext,State *pState)

{

pContext->ChangeState(pState);

}

//状态子类可以共享,所以用单例模式,这里就忽略内存释放的问题了

class ConcreteStateA;

class ConcreteStateC:public State

{

public:

staticState* GetStateAInstance()

{

if(m_pInstance == NULL)

{

m_pInstance = new ConcreteStateC("状态 C");

}

returnm_pInstance;

}

voidHandle(Context *pContext);

private:

ConcreteStateC(string name):State(name)

{ }

staticConcreteStateC *m_pInstance;

};

class ConcreteStateB:public State

{

public:

staticState* GetStateAInstance()

{

if(m_pInstance == NULL)

{

m_pInstance = new ConcreteStateB("状态 B");

}

returnm_pInstance;

}

voidHandle(Context *pContext)

{

cout<<"状态 B 处理的业务逻辑"<<endl;< p="">

ChangeState(pContext,ConcreteStateC::GetStateAInstance());

}

private:

ConcreteStateB(string name):State(name)

{ }

staticConcreteStateB *m_pInstance;

};

class ConcreteStateA:public State

{

public:

staticState* GetStateAInstance()

{

if(m_pInstance == NULL)

{

m_pInstance = new ConcreteStateA("状态 A");

}

returnm_pInstance;

}

voidHandle(Context *pContext)

{

cout<<"状态 A 处理的业务逻辑"<<endl;< p="">

ChangeState(pContext,ConcreteStateB::GetStateAInstance());

}

private:

ConcreteStateA(string name):State(name)

{ }

staticConcreteStateA *m_pInstance;

};

voidConcreteStateC::Handle(Context *pContext)

{

cout<<"状态 C 处理的业务逻辑"<<endl;< p="">

ChangeState(pContext,ConcreteStateA::GetStateAInstance());

}

ConcreteStateA*ConcreteStateA::m_pInstance = NULL;

ConcreteStateB*ConcreteStateB::m_pInstance = NULL;

ConcreteStateC*ConcreteStateC::m_pInstance = NULL;

Context *pContext = new Context;

pContext->SetCurrentState(ConcreteStateA::GetStateAInstance());

pContext->Request();

pContext->Request();

pContext->Request();

状态模式----C++实现的更多相关文章

  1. StatePattern(状态模式)

    /** * 状态模式 * @author TMAC-J * 状态模式和策略模式很像,其实仔细研究发现完全不一样 * 策略模式各策略之间没有任何关系,独立的 * 状态模式各状态之间接口方法都是一样的 * ...

  2. 设计模式(十二):通过ATM取款机来认识“状态模式”(State Pattern)

    说到状态模式,如果你看过之前发布的重构系列的文章中的<代码重构(六):代码重构完整案例>这篇博客的话,那么你应该对“状态模式”并不陌生,因为我们之前使用到了状态模式进行重构.上一篇博客我们 ...

  3. php实现设计模式之 状态模式

    <?php /*状态模式:允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类.(行为模式) * * 在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做 ...

  4. Java 策略模式和状态模式

    本文是转载的,转载地址:大白话解释Strategy模式和State模式的区别 先上图: 本质上讲,策略模式和状态模式做得是同一件事:去耦合.怎么去耦合?就是把干什么(语境类)和怎么干(策略接口)分开, ...

  5. javascript - 状态模式 - 简化分支判断流程

    状态模式笔记   当一个对象的内部状态发生改变时,会导致行为的改变,这像是改变了对象   状态模式既是解决程序中臃肿的分支判断语句问题,将每个分支转化为一种状态独立出来,方便每种状态的管理又不至于每次 ...

  6. C#设计模式系列:状态模式(State)

    1.状态模式简介 1.1>.定义 状态模式的核心思想是允许一个对象在它的内部状态改变时改变它的行为,即不同的状态对应不同的行为. 状态模式的针对性很强,当有状态变化的时候可以选择状态模式. 1. ...

  7. 十一个行为模式之状态模式(State Pattern)

    定义: 当一个对象有多个状态,并且在每个状态下有不同的行为,可以使用状态模式来在其内部改变状态时改变其行为,而客户端不会察觉状态的改变,仍使用同样的方法或接口与对象进行交互. 结构图: Context ...

  8. java设计模式之状态模式

    状态模式 允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类. 状态模式UML图 上下文环境(Context):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关 ...

  9. iOS - 在工程中试玩状态模式

    做了一个项目,项目中一个藏品详情界面针对不同用户,和用户所处于的状态的不同,展示的效果和操作的权限都会不同.想到了状态模式,从来没有用过,赶紧学一下然后用一用.期待兴奋 看了这么多的博客,终于找到一个 ...

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

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

随机推荐

  1. JavaScript学习笔记之 数组方法一 堆栈 和队列

    数组的方法 以及 堆栈的操作的方法 JavaScript是一种弱类型语言,不像其它程序语言需要严格定义数据类型.在JavaScript中数组可以任意修改变动,这样也就出现了一个问题,如果边遍历数组边操 ...

  2. RMAN常用备份恢复命令汇总

    RMAN命令 1.独立命令  RMAN>shutdown immediate  RMAN>startup  RMAN>backup format 'd:\backup\%d_%s.b ...

  3. java Math.random()随机数的产生

    Math.random()是java内置产生随机数的函数,Math.random()能够产生[0,1)的浮点数,当我们要产生特定范围的数时,可以采用如下办法: 1.Math.random()*(最大数 ...

  4. Linux_X64安装Jboss

    一.系统环境 系统平台:RedHat 6.4 Java version:jdk-6u45-linux-x64 Jboss version:jboss-5.1.0.GA-jdk6   二.下载jdk1. ...

  5. Installation error: INSTALL_CANCELED_BY_USER

    这个错误,从字面上理解,就是已经安装的时候被用户取消了. 我出现这个错误的时候,是手机连接在电脑上的. 经过网上搜索,确认这是安装apk到手机时,被手机取消了安装操作. 1. 确保手机处于开发者模式. ...

  6. 不用派生CTreeCtrl不用繁琐的过程 教你如何让CTreeCtrl的每一项有ToolTip提示

    最近工作中需要让CTreeCtrl控件的每一项都有提示信息,于是谷歌百度,爬山涉水,结果是………….在CodeProject里找到一篇文章是把CTreeCtrl派生出新类,重载一些函数自定义内容.使用 ...

  7. 【android】修改android默认应用图标

    我自己做的一个小程序,想更改程序安装后的默认显示图片,但是我发现只能改一次,以后再改还是显示第一次更改后的图片(此时我已把最后一次更改前的全部图片都删除了,所以不会是名称填错),这是为什么??求高人指 ...

  8. linux修改密码

    情景:Linux 服务器上用户的密码被服务器管理员发现太过简单,需要重置密码.处理时为了方便记忆,就直接使用普通用户登录,修改密码时,在原密码的基础上增加一串特定的数字,结果提示不通过.例如出现错误提 ...

  9. js 16进制字符串互转

    /** * 16进制转换为字符串 * @param hex * @returns {*} */ function hexToString(hex) { var tmp = ''; if (hex.le ...

  10. WordPress插件制作教程(二): 编写一个简单的插件

    上一篇说到了如何创建一个插件,我想大家看了之后一定会有所收获,这一篇简单给大家写一个插件样例,让大家有一个基本的印象.这个插件的样例就是当你激活这个插件后会在你的每篇文章中插入一段自己定义好的内容,比 ...