状态模式----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设计模式]山西面馆中的设计模式— ...
随机推荐
- 原生 javascript 学习之 js变量
1.变量的命名 方法的命名(驼峰命名法) 全部小写 : 单词与单词之间全部下划线 (my_namespace) 大小写混合 : 第一个单词首字母小写其他单词首字母大写. 规则 首字符 英文字母或下划线 ...
- 诡异的SpriteKit 游戏查错
在Endless Runner 游戏中,做了一些atlas后,发现有个问题,当player跳跃起来的时候,发现他没有动画了,被默认的X图片代替.原来的图像是这样的. 在增加了一些动画后,我的效果就成这 ...
- unison实时双向数据同步
软件下载 ocamlopt下载地址:http://caml.inria.fr Unison下载地址:http://www.seas.upenn.edu/~bcpierce/unison 1.安装uni ...
- 5 输出的properties文件按照key进行排序
import java.io.BufferedWriter; import java.io.FileInputStream; import java.io.FileNotFoundException; ...
- poj1915 BFS
D - 广搜 基础 Crawling in process... Crawling failed Time Limit:1000MS Memory Limit:30000KB 64bi ...
- PCL编译历程
boost 编译安装包下载地址: http://boost.teeks99.com/ boost安装:http://blog.sina.com.cn/s/blog_7c48b0f10102v0zj.h ...
- 安装hadoop1.2.1集群环境
一.规划 (一)硬件资源 10.171.29.191 master 10.173.54.84 slave1 10.171.114.223 slave2 (二)基本资料 用户: jediael 目录 ...
- JS+css滑动菜单简单实现
JS+css滑动菜单 制作一个简单的滑动菜单,当鼠标指向菜单标题时,滑出二级菜单.移开时二级菜单隐藏.目标很简单,实践时有一些细节需要注意,比如鼠标移向二级菜单的 过程中,二级菜单消失了.还有定位出错 ...
- CSS实现背景透明/半透明效果的方法
全透明代码:{background:transparent} 半透明代码:{filter:alpha(opacity=80);-moz-opacity:0.8;width:auto !importan ...
- R语言数据处理
写在前面:数据处理是数据分析与挖掘必不可少的步骤.下面列出一些常用的数据处理操作. 一.类型转换 用class()查看数据的类型,用as.类型名()进行类型转换. > num <- as. ...