大话设计模式--状态模式 State -- C++实现实例

时间:2022-09-02 16:35:44

1.状态模式: 当一个对象的内在状态改变时,允许改变其行为,这个对象看起来就像是改变了其类。

状态模式解决的是当控制一个对象状态转换的条件表达式过于复杂, 把状态的判断逻辑转移到表示不同状态的一系列类当中,

可以把复杂的判断逻辑简化。

大话设计模式--状态模式 State -- C++实现实例

状态模式通过把各种状态转移逻辑分布到State的子类之间,减少相互之间的依赖。

当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为时,就可以考虑使用状态模式。

大话设计模式--状态模式 State -- C++实现实例

实例::

context.h context.cpp

#ifndef CONTEXT_H
#define CONTEXT_H class State; class Context
{
public:
Context(State *state);
void request();
State *state; }; #endif // CONTEXT_H
#include "context.h"
#include "state.h" Context::Context(State *state)
{
this->state = state;
} void Context::request()
{ state->handle(this);
}

state.h state.cpp

#ifndef STATE_H
#define STATE_H class Context; class State
{
public:
State();
void virtual handle(Context *context);
}; #endif // STATE_H
#include "state.h"
#include "context.h" State::State()
{
} void State::handle(Context *context)
{ }

statea.h statea.cpp

#ifndef STATEA_H
#define STATEA_H #include "state.h"
#include "context.h"
#include "stateb.h" class StateA : public State
{
public:
StateA();
void handle(Context *context);
}; #endif // STATEA_H
#include "statea.h"
#include "state.h"
#include "context.h"
#include "stateb.h"
#include <stdio.h> StateA::StateA()
{
} void StateA::handle(Context *context)
{
printf("on StateA\n");
context->state = new StateB();
}

stateb.h stateb.cpp

#ifndef STATEB_H
#define STATEB_H #include "statea.h"
#include "context.h" class StateB : public State
{
public:
StateB();
void handle(Context *context);
}; #endif // STATEB_H
#include "stateb.h"
#include "statea.h"
#include "context.h"
#include <stdio.h> StateB::StateB()
{
} void StateB::handle(Context *context)
{
printf("on StateB\n");
context->state = new StateA();
}

main.cpp  可以状态AB之间相互切换,而只需要一个方法request

#include <iostream>
#include "context.h"
#include "statea.h"
#include "stateb.h" using namespace std; int main()
{
cout << "State test!" << endl; Context *c = new Context(new StateA);
c->request();
c->request();
c->request(); return 0;
}

大话设计模式--状态模式 State -- C++实现实例的更多相关文章

  1. C&num;设计模式——状态模式&lpar;State Pattern&rpar;

    一.概述在面向对象软件设计时,常常碰到某一个对象由于状态的不同而有不同的行为.如果用if else或是switch case等方法处理,对象操作及对象的状态就耦合在一起,碰到复杂的情况就会造成代码结构 ...

  2. 大话设计模式--工厂模式 factory -- C&plus;&plus;实现实例

    实现<大话设计模式>的C++版本... 1. 工厂模式 使用的范围是 同一个基类,下面很多子类. (1)这里很容易出现的一个问题n多的子类继承自抽象基类,我们不得不在每次要用到子类的地方就 ...

  3. 大话设计模式--访问者模式 Visitor -- C&plus;&plus;实现实例

    1. 访问者模式: 表示一个作用于某对象结构中的和元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 访问者模式把数据结构和作用于结构上的操作之间的耦合脱开,使得操作集合可以 ...

  4. 大话设计模式--解释器模式 interpreter -- C&plus;&plus;实现实例

    1. 解释器模式: 给定一个语言,定义它的文法的一种表示 并 定义一个解释器,这个解释器使用该表示文法 来解释语言中的句子. 如果一种特定类型的问题发生的频率很高,那么可能就值得将该问题的各个实例表述 ...

  5. 大话设计模式--命令模式 Command -- C&plus;&plus;实现实例

    1. 命令模式: 将请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作. 命令模式有点: a. 较容易的设计一个命令队列 b. 在需要的的情况 ...

  6. 大话设计模式--桥接模式 Bridge -- C&plus;&plus;实现实例

    1. 桥接模式: 将抽象部分与它的实现部分分离,使它们都可以独立的变化. 分离是指 抽象类和它的派生类用来实现自己的对象分离. 实现系统可以有多角度分类,每一种分类都有可能变化,那么把这种多角度分离出 ...

  7. 大话设计模式--组合模式 Composite -- C&plus;&plus;实现实例

    1. 组合模式: 将对象组合成树形结构以表示"部分--整体"的层次结构,组合模式使用户对单个对象和组合对象的使用具有一致性. 需求中是体现部分与整体层次的结构时,希望用户可以忽略组 ...

  8. 大话设计模式--建造者模式 Builder -- C&plus;&plus;实现实例

    1. 建造者模式,将一个复杂对象的构建与它的表示分离, 使得同样的构建过程可以创建不同的表示. 用户只需要指定需要建造的类型就可以得到他们,而具体建造的过程和细节就不需要知道了. 关键类Directo ...

  9. 大话设计模式--外观模式 Facade -- C&plus;&plus;实现实例

    1.  外观模式: 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这个子系统更加容易使用. 外观模式的使用场合: A: 设计初期阶段,应该要有意识的将不同的两个层分离. ...

随机推荐

  1. 复利计算APP版-----娱乐一下

    先不说那么多,下载地址来一个:http://pan.baidu.com/s/1eSz2GBg 目前版本号为:0.3 lastest 软件上线了!三平台首发! 下载地址: http://shouji.b ...

  2. aa

    #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> us ...

  3. Java编程思想学习笔记&lowbar;2&lpar;继承和多态&rpar;

    静态初始化: 静态初始化只在必要的时刻进行.(即当程序需要加载类进入内存的时候,执行静态初始化.静态变量和静态代码块的初始化顺序,按照在代码中声明的顺序老执行.例如:如果要执行某个public类,那么 ...

  4. 【BZOJ 1069】 凸包&plus;旋转卡壳

    1069: [SCOI2007]最大土地面积 Description 在某块平面土地上有N个点,你可以选择其中的任意四个点,将这片土地围起来,当然,你希望这四个点围成的多边形面积最大. Input 第 ...

  5. BZOJ&lowbar;4864&lowbar;&lbrack;BeiJing 2017 Wc&rsqb;神秘物质&lowbar;Splay

    BZOJ4864_[BeiJing 2017 Wc]神秘物质_Splay Description 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天 ...

  6. Xshell访问和连接Linux

    Xshell是一款强大的安全终端模拟软件,Xshell 模拟了远程主机的操作,其实质就是通过访问和连接到远程主机,在本地实现对远程主机的操作.  一.下载 官网:https://www.netsara ...

  7. 【POJ2230】Watchcow

    题目大意:给定一个 N 个点,M 条边的无向图,要求不重复地经过每条边两次,并且从 1 号节点出发最后回到 1 号节点,求一条路径. 题解:不重复地经过两次这个操作很容易地通过无向图的建边方式来实现, ...

  8. 设备指纹&lpar;Device Fingerprinting&rpar;是什么?

    简单来讲,设备指纹是指可以用于标识出该设备的设备特征或者独特的设备标识.设备指纹因子通常包括计算机的操作系统类型,安装的各种插件,浏览器的语言设置及其时区 .设备的硬件ID,手机的IMEI,电脑的网卡 ...

  9. Intellij下Jquery中文乱码

    今天在用Jquery+Ajax实现检查用户名是否可用的功能时,意外的发生了乱码,谷歌了很久后终于找到了解决办法: 把js文件复制一份在桌面 用记事本打开,另存为UTF-8格式 复制粘贴回去,覆盖之前的 ...

  10. python flask实现小项目方法

    本文目的是为了完成一个项目用到的flask基本知识,例子会逐渐加深.最好对着源码,一步一步走. 下载源码,运行 pip install -r requirements.txt 建立环境 python ...