设计模式之十二:状态模式(State)
2024-08-30 03:50:40
状态模式:
当一个对象的内部状态发生变化时同意改变它的行为。
Allow an object to alter its behavior when its internal state changes. The object will appear to change its class.
状态模式将依赖于状态的行为分离成了各种状态类,每一种特定的转态类仅仅处理单一的行为。而且定义了各种状态之间的转移变迁关系。
UML图:
主要包括:
- Context:定义了client须要的接口,操作了一个当前状态类的引用
- State:抽象的状态类。为继承的类定义了一个依赖于当前状态的接口。
- 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类之间推断转移关系。
最新文章
- 织梦DedeCMS模板防盗的四种方法
- jsp+ajax实现无刷新
- GC overhead limit exceeded填坑心得
- Redis教程(十):持久化详解
- jsp中JavaBean的用法
- LeetCode Ugly Number (简单题)
- Ubuntu 14.04 关于 TensorFlow 环境的配置
- Generate GUID using vbscript
- AngularJS初体验
- 分布式文件系统 Mogilefs 安装步骤
- Java DOM4J读取XML
- 2015 HDU 计算机学院 院赛 1003 玩骰子
- JQ倒计时,正计时
- 第二章 Java程序设计环境
- windows 下 nginx 配置文件路径
- AT1219 歴史の研究 解题报告
- 监控mysql状态脚本
- C语言中内存分布及程序运行中(BSS段、数据段、代码段、堆栈)
- linux命令中which、whereis、locate有什么区别?
- 多级菜单系统安装维护shell脚本实现企业级案例
热门文章
- Create an ASP.NET Core web app in Visual Studio Code
- BZOJ 3631 链剖+差分
- 手动新建hive编程环境(以hive-1.0.0和hive-1.2.1为例)
- highcharts中的x轴如何显示时分秒时间格式
- 【Henu ACM Round#14 F】 President and Roads
- poj 1087 A Plug for UNIX(字符串编号建图)
- js---16原型链
- 操作系统的 (program)loader(程序加载器)
- 56.如何清除已经设置的npm config配置
- 如何解决Linux下的软件包依赖问题