状态模式----C++实现
-
状态模式
定义:
允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
实用性:
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++实现的更多相关文章
- StatePattern(状态模式)
/** * 状态模式 * @author TMAC-J * 状态模式和策略模式很像,其实仔细研究发现完全不一样 * 策略模式各策略之间没有任何关系,独立的 * 状态模式各状态之间接口方法都是一样的 * ...
- 设计模式(十二):通过ATM取款机来认识“状态模式”(State Pattern)
说到状态模式,如果你看过之前发布的重构系列的文章中的<代码重构(六):代码重构完整案例>这篇博客的话,那么你应该对“状态模式”并不陌生,因为我们之前使用到了状态模式进行重构.上一篇博客我们 ...
- php实现设计模式之 状态模式
<?php /*状态模式:允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类.(行为模式) * * 在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做 ...
- Java 策略模式和状态模式
本文是转载的,转载地址:大白话解释Strategy模式和State模式的区别 先上图: 本质上讲,策略模式和状态模式做得是同一件事:去耦合.怎么去耦合?就是把干什么(语境类)和怎么干(策略接口)分开, ...
- javascript - 状态模式 - 简化分支判断流程
状态模式笔记 当一个对象的内部状态发生改变时,会导致行为的改变,这像是改变了对象 状态模式既是解决程序中臃肿的分支判断语句问题,将每个分支转化为一种状态独立出来,方便每种状态的管理又不至于每次 ...
- C#设计模式系列:状态模式(State)
1.状态模式简介 1.1>.定义 状态模式的核心思想是允许一个对象在它的内部状态改变时改变它的行为,即不同的状态对应不同的行为. 状态模式的针对性很强,当有状态变化的时候可以选择状态模式. 1. ...
- 十一个行为模式之状态模式(State Pattern)
定义: 当一个对象有多个状态,并且在每个状态下有不同的行为,可以使用状态模式来在其内部改变状态时改变其行为,而客户端不会察觉状态的改变,仍使用同样的方法或接口与对象进行交互. 结构图: Context ...
- java设计模式之状态模式
状态模式 允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类. 状态模式UML图 上下文环境(Context):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关 ...
- iOS - 在工程中试玩状态模式
做了一个项目,项目中一个藏品详情界面针对不同用户,和用户所处于的状态的不同,展示的效果和操作的权限都会不同.想到了状态模式,从来没有用过,赶紧学一下然后用一用.期待兴奋 看了这么多的博客,终于找到一个 ...
- [Head First设计模式]生活中学设计模式——状态模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
随机推荐
- Win7x64安装Oracle11201x64 解决PLSQL Developer无法找到oci问题
http://blog.sina.com.cn/s/blog_4c7628c40101cf56.html http://blog.csdn.net/shenkxiao/article/details/ ...
- UIWindow in iOS
这篇文章,我将分享对UIWindow我所知道的东西. keyWindow 一个应用能够有许多UIWindow,“The key window”是其中一个,被设计用来接受键盘和其他与点击无关的事件.一个 ...
- input(file)浏览按钮美化 (巨简单),网上那些都弱爆了
<!DOCTYPE HTML> <html> <body> <input type="file" id="upload" ...
- myeclipse修改内存
安装完成后,在安装目录有个config.ini文件,内容如下:-vmargs-Xms40m-Xmx256m Xms:初始化内存大小xmx:最大内存大小用编辑工具打开他,把Xms 和Xmx更改成自己需要 ...
- 空值排序(oracle和sqlserver)
oracle认为 null 最大. 升序排列,默认情况下,null值排后面. 降序排序,默认情况下,null值排前面. 改变空值办法: (1)用nvl函数或decode函数将null转换为一特定值 替 ...
- 二维码生成 - QrCodeNet
下载QrCodeNet /// <summary> /// 生成QR码 /// </summary> /// <param name="output_path& ...
- android中细节效果总结
android中细节效果总结 andorid取消最上方的标题同时全屏显示 Source code protected void onCreate(Bundle savedInstanceS ...
- 转载--eclipse git插件安装
原文地址:http://yufenfei.iteye.com/blog/1750124/ 一.Eclipse上安装GIT插件EGit Eclipse的版本eclipse-java-helios-SR2 ...
- OFBiz中根据店铺获取产品可用库存的方法
1.[ProductStoreFacility]获得店铺绑定的仓库列表 2.遍历仓库,调用[getInventoryAvailableByFacility],传入[facilityId : facil ...
- jquery select三级联动
需求:对地区进行选择,选择相应的省,就会出现相应范围的市,然后出现相应的范围的县区:如果县不存在,就不现实,自我要求是自己写个简单的插件,方便以后调用: 逻辑:1.通过div的类名来获取,其下的sel ...