设计模式之十二:状态模式(State)
状态模式:
当一个对象的内部状态发生变化时同意改变它的行为。
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类之间推断转移关系。
设计模式之十二:状态模式(State)的更多相关文章
- C#设计模式之十九状态模式(State Pattern)【行为型】
一.引言 今天我们开始讲"行为型"设计模式的第六个模式,该模式是[状态模式],英文名称是:State Pattern.无论是现实世界,还是面向对象的OO世界,里面都有一个东西, ...
- C#设计模式之十八状态模式(State Pattern)【行为型】
一.引言 今天我们开始讲“行为型”设计模式的第六个模式,该模式是[状态模式],英文名称是:State Pattern.无论是现实世界,还是面向对象的OO世界,里面都有一个东西,那就是对象.有对象当然就 ...
- Java进阶篇设计模式之十二 ---- 备忘录模式和状态模式
前言 在上一篇中我们学习了行为型模式的策略模式(Strategy Pattern)和模板模式(Template Pattern).本篇则来学习下行为型模式的两个模式,备忘录模式(Memento Pat ...
- Java设计模式之十二 ---- 备忘录模式和状态模式
前言 在上一篇中我们学习了行为型模式的策略模式(Strategy Pattern)和模板模式(Template Pattern).本篇则来学习下行为型模式的两个模式,备忘录模式(Memento Pat ...
- C#设计模式之十二代理模式(Proxy Pattern)【结构型】
一.引言 今天我们要讲[结构型]设计模式的第七个模式,也是“结构型”设计模式中的最后一个模式,该模式是[代理模式],英文名称是:Proxy Pattern.还是老套路,先从名字上来看看.“代理”可以理 ...
- Headfirst设计模式的C++实现——状态模式(State)
state.h #ifndef _STATE_H_ #define _STATE_H_ class GumballMachine; class State { public: ; ; ; ; Stat ...
- 二十四种设计模式:状态模式(State Pattern)
状态模式(State Pattern) 介绍允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它所属的类. 示例有一个Message实体类,对它的操作有Insert()和Get()方法, ...
- Java 设计模式系列(二十)状态模式
Java 设计模式系列(二十)状态模式 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式.状态模式允许一个对象在其内部状态改变的时候改 ...
- Java设计模式(十) 备忘录模式 状态模式
(十九)备忘录模式 备忘录模式目的是保存一个对象的某个状态,在适当的时候恢复这个对象. class Memento{ private String value; public Memento(Stri ...
- 北风设计模式课程---状态模式State(对象行为型)
北风设计模式课程---状态模式State(对象行为型) 一.总结 一句话总结: 状态模式 具体状态的行为在具体的状态类中就解决,不用交给外部做判断.实质是将多条件判断弄成了多个类,在不同的类中做判断 ...
随机推荐
- thinkphp路由的作用
thinkphp路由的作用 问题 请问一下什么是thinkPHP路由,路由有什么作用?谢谢 解答 网络访问地址从来都是映射访问的,最初是这样,主机名(电脑名称)=>ip地址(如局域网192.16 ...
- 9.ng-options
转自:https://www.cnblogs.com/best/tag/Angular/ 该指令允许你基于一个迭代表达式添加选项 <select ng-model="color&quo ...
- 22.dll调用技术
1.dll文件: #include <Windows.h> _declspec(dllexport) void message_hello() { MessageBoxA(, ); } _ ...
- Python(四) 分支、循环、条件与枚举
一.什么是表达式 表达式(Expression)是运算符(operator)和操作数(operand)所构成的序列 二.表达式的优先级 三.表达式优先级练习 优先级同级 从左往右计算 1 or 2 a ...
- Fedora27 源配置
一.添加阿里源,阿里源我感觉是现在国内比较好用的源,支持的发行版比较全.配置方法1.备份系统自带的源mv /etc/yum.repos.d/fedora.repo /etc/yum.repos.d/f ...
- Linux桌面词典 星际译王(StarDict)
星际译王(StarDict)是利用GTK(GIMP TOOLKIT)开发的国际化的.跨平台的自由的桌面字典软件.它并不包含字典档,使用者须自行下载配合使用.它可以运行于多种不同的平台,如Linux, ...
- 详解:Linux Chrony 设置服务器集群同步时间
导读: Chrony是一个开源的自由软件,像CentOS 7或基于RHEL 7操作系统,已经是默认服务,默认配置文件在 /etc/chrony.conf 它能保持系统时间与时间服务器(NTP)同步,让 ...
- 紫书 习题 10-16 UVa 1647 (高精度+递推)
这道题我已经推出00和1过两步变成00了,可我没有继续做下去-- 后来看了博客发现自己已经做了90%了-- 可惜了,以后不要轻易放弃. 1的个数有个规律,就是每次都乘以2,因为0和1下一步都会变出1 ...
- php验证邮箱,手机号是否正确
function is_valid_email($email)//判断是不是邮箱的函数{ return preg_match('/^[a-zA-Z0-9._%-]+@([a-zA-Z0-9.-] ...
- 【转】flex中的labelFunction(combox和dataGrid)
Flex中,对于显示一个字段,只需要指定对应字段属性给labelField即可,当需要上述所需要的功能的时候就得做个转换了,在Flex的基于List的组件都有一个labelFunction方法能很简单 ...