状态模式:

当一个对象的内部状态发生变化时同意改变它的行为。

Allow an object to alter its behavior when its internal state changes. The object will appear to change its class.

状态模式将依赖于状态的行为分离成了各种状态类,每一种特定的转态类仅仅处理单一的行为。而且定义了各种状态之间的转移变迁关系。

UML图:

主要包括:

  1. Context:定义了client须要的接口,操作了一个当前状态类的引用
  2. State:抽象的状态类。为继承的类定义了一个依赖于当前状态的接口。
  3. ConcreteState:详细的状态类,每个子类都实现了特性状态相关的行为。

C++代码例如以下:

#include <stdlib.h>
#include <stdio.h>
#include <iostream> class Context; class State{
public:
virtual void handle(Context * c)=0;
}; class Context
{
public:
void setState(State * s)
{
state=s;
}
void request()
{
state->handle(this);
} private:
State * state;
}; class ConcreteStateA:public State
{
public:
void handle(Context * c);
}; //注意这里ConcreteStateA和ConcreteStateB之间相互包括。所以须要将handle方法写在类外面。
class ConcreteStateB:public State
{
public:
void handle(Context * c);
}; void ConcreteStateA::handle(Context * c)
{
std::cout<<"do something dependended on concreteStateA"<<std::endl;
c->setState(new ConcreteStateB());
} void ConcreteStateB::handle(Context * c)
{
std::cout<<"do something dependended on concreteStateB"<<std::endl;
c->setState(new ConcreteStateA());
} int main()
{
Context * c=new Context();
State * sA=new ConcreteStateA();
c->setState(sA); c->request();
c->request();
c->request(); return 0;
}

运行结果例如以下:

详细使用时能够在Context中添加一个成员变量。依据这个成员变量的值在详细的State类之间推断转移关系。

最新文章

  1. 织梦DedeCMS模板防盗的四种方法
  2. jsp+ajax实现无刷新
  3. GC overhead limit exceeded填坑心得
  4. Redis教程(十):持久化详解
  5. jsp中JavaBean的用法
  6. LeetCode Ugly Number (简单题)
  7. Ubuntu 14.04 关于 TensorFlow 环境的配置
  8. Generate GUID using vbscript
  9. AngularJS初体验
  10. 分布式文件系统 Mogilefs 安装步骤
  11. Java DOM4J读取XML
  12. 2015 HDU 计算机学院 院赛 1003 玩骰子
  13. JQ倒计时,正计时
  14. 第二章 Java程序设计环境
  15. windows 下 nginx 配置文件路径
  16. AT1219 歴史の研究 解题报告
  17. 监控mysql状态脚本
  18. C语言中内存分布及程序运行中(BSS段、数据段、代码段、堆栈)
  19. linux命令中which、whereis、locate有什么区别?
  20. 多级菜单系统安装维护shell脚本实现企业级案例

热门文章

  1. Create an ASP.NET Core web app in Visual Studio Code
  2. BZOJ 3631 链剖+差分
  3. 手动新建hive编程环境(以hive-1.0.0和hive-1.2.1为例)
  4. highcharts中的x轴如何显示时分秒时间格式
  5. 【Henu ACM Round#14 F】 President and Roads
  6. poj 1087 A Plug for UNIX(字符串编号建图)
  7. js---16原型链
  8. 操作系统的 (program)loader(程序加载器)
  9. 56.如何清除已经设置的npm config配置
  10. 如何解决Linux下的软件包依赖问题