状态模式:

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

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类之间推断转移关系。

设计模式之十二:状态模式(State)的更多相关文章

  1. C#设计模式之十九状态模式(State Pattern)【行为型】

    一.引言   今天我们开始讲"行为型"设计模式的第六个模式,该模式是[状态模式],英文名称是:State Pattern.无论是现实世界,还是面向对象的OO世界,里面都有一个东西, ...

  2. C#设计模式之十八状态模式(State Pattern)【行为型】

    一.引言 今天我们开始讲“行为型”设计模式的第六个模式,该模式是[状态模式],英文名称是:State Pattern.无论是现实世界,还是面向对象的OO世界,里面都有一个东西,那就是对象.有对象当然就 ...

  3. Java进阶篇设计模式之十二 ---- 备忘录模式和状态模式

    前言 在上一篇中我们学习了行为型模式的策略模式(Strategy Pattern)和模板模式(Template Pattern).本篇则来学习下行为型模式的两个模式,备忘录模式(Memento Pat ...

  4. Java设计模式之十二 ---- 备忘录模式和状态模式

    前言 在上一篇中我们学习了行为型模式的策略模式(Strategy Pattern)和模板模式(Template Pattern).本篇则来学习下行为型模式的两个模式,备忘录模式(Memento Pat ...

  5. C#设计模式之十二代理模式(Proxy Pattern)【结构型】

    一.引言 今天我们要讲[结构型]设计模式的第七个模式,也是“结构型”设计模式中的最后一个模式,该模式是[代理模式],英文名称是:Proxy Pattern.还是老套路,先从名字上来看看.“代理”可以理 ...

  6. Headfirst设计模式的C++实现——状态模式(State)

    state.h #ifndef _STATE_H_ #define _STATE_H_ class GumballMachine; class State { public: ; ; ; ; Stat ...

  7. 二十四种设计模式:状态模式(State Pattern)

    状态模式(State Pattern) 介绍允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它所属的类. 示例有一个Message实体类,对它的操作有Insert()和Get()方法, ...

  8. Java 设计模式系列(二十)状态模式

    Java 设计模式系列(二十)状态模式 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式.状态模式允许一个对象在其内部状态改变的时候改 ...

  9. Java设计模式(十) 备忘录模式 状态模式

    (十九)备忘录模式 备忘录模式目的是保存一个对象的某个状态,在适当的时候恢复这个对象. class Memento{ private String value; public Memento(Stri ...

  10. 北风设计模式课程---状态模式State(对象行为型)

    北风设计模式课程---状态模式State(对象行为型) 一.总结 一句话总结: 状态模式 具体状态的行为在具体的状态类中就解决,不用交给外部做判断.实质是将多条件判断弄成了多个类,在不同的类中做判断 ...

随机推荐

  1. NET Remoting原理及应用

    .NET Remoting原理及应用实例: Remoting:(本文摘自百度百科) 简介:        什么是Remoting,简而言之,我们可以将其看作是一种分布式处理方 式.从微软的产品角度来看 ...

  2. jasperreport 追加新报表(2)

    用ireport做好模版后,如果要新加一个打印页,如果是新手,直接修改模版应该是理想情况, 可是什么数据源 feild,parameter,var,subreport ,还有路径, 真的可以让一个人疯 ...

  3. SQLServer2008端口及防火墙设置

    一,Microsoft SQL Server 2008R2数据库设置 1.       开始=>程序=>Microsoft SQL Server 2008R2=>配置工具=>S ...

  4. tensorflow学习之路---解决过拟合

    ''' 思路:1.调用数据集 2.定义用来实现神经元功能的函数(包括解决过拟合) 3.定义输入和输出的数据4.定义隐藏层(函数)和输出层(函数) 5.分析误差和优化数据(改变权重)6.执行神经网络 ' ...

  5. 【VC++学习笔记五】SDI|MDI的全屏显示

    一.Mainframe中添加一个记录是否全屏状态的变量BOOL m_bFullScreen. 二.工具栏添加一个按钮,进行全屏的操作,响应事件函数写在Mainframe中. 三.在响应函数中,添加如下 ...

  6. SpringBoot 静态资源 加载位置

    1.配置自定义拦截器 /** * Copyright (C), 2017-2018, XXX有限公司 * FileName: WebConfig * Author: 丶Zh1Guo * Date: 2 ...

  7. 学习——HTML5

    HTML5多用于手机页面制作,因为PC版浏览器大多不兼容,可以通过下面网站查看HTML5浏览器兼容情况: http://www.caniuse.com/#index 一.语义化标签 1.<hea ...

  8. CSUOJ 1635 Restaurant Ratings

    1635: Restaurant Ratings Time Limit: 1 Sec  Memory Limit: 128 MB Description A famous travel web sit ...

  9. 【原生JS组件】javascript 运动框架

    大家都知道JQuerry有animate方法来给DOM元素进行运动,CSS3中也有transition.transform来进行运动.而使用原生的Javascript来控制元素运动,须要写非常多运动的 ...

  10. Unix/Linux环境C编程新手教程(37) shell经常使用命令演练

     cat命令 cat命令能够用来查看文件内容. cat [參数] 文件名称. grep-指定文件里搜索指定字符内容. Linux的文件夹或文件. -path '字串' 查找路径名匹配所给字串的全部 ...