C++状态模式:State Pattern

2023-10-28

状态模式:允许对象在其内部状态改变时改变它的行为,对象看起来好像修改类它的类。

状态模式是有限状态机(Finite State Machine)的一种实现方式。

我们都知道,http请求报文由请求行、请求头、请求空行和请求体四部分组成,服务器在解析请求报文时,会根据当前所在行的状态来进行不同方式的解析(逐行解析)。

类图:

 

实现如下:

state.h:

#ifndef STATE_H
#define STATE_H
#include <iostream>
using namespace std;

class State {
public:
    virtual void work() = 0;
};
#endif // STATE_H


requestLine.h:

#ifndef REQUESTLINE_H
#define REQUESTLINE_H
#include "state.h"

class RequestLine : public State {
public:
    virtual void work() override
    {
        cout << "解析请求行" << endl;
    }
};

#endif // REQUESTLINE_H


requestHeader.h:

#ifndef REQUESTHEADER_H
#define REQUESTHEADER_H
#include "state.h"

class RequestHeader : public State {
public:
    virtual void work() override
    {
        cout << "解析请求头" << endl;
    }
};
#endif // REQUESTHEADER_H


requestBlankLine.h:

#ifndef REQUESTBLANKLINE_H
#define REQUESTBLANKLINE_H
#include "state.h"

class RequestBlankLine : public State {
public:
    virtual void work() override
    {
        cout << "解析请求空行" << endl;
    }
};
#endif // REQUESTBLANKLINE_H


requestBody.h:

#ifndef REQUESTBODY_H
#define REQUESTBODY_H
#include "state.h"

class RequestBody : public State {
public:
    virtual void work() override
    {
        cout << "解析请求体" << endl;
    }
};
#endif // REQUESTBODY_H


httpAnalyze.h:

#ifndef HTTPANALYZE_H
#define HTTPANALYZE_H
#include "requestLine.h"
#include "requestHeader.h"
#include "requestBlankLine.h"
#include "requestBody.h"

class HttpAnalyze {
public:
    void setCurState(State* s)
    {
        m_curState = s;
    }

    void analyze()
    {
        m_curState->work();
    }
private:
    State* m_line = new RequestLine();
    State* m_header = new RequestHeader();
    State* m_blankLine = new RequestBlankLine();
    State* m_body = new RequestBody();
    State* m_curState;
};

#endif // HTTPANALYZE_H


main.cpp:

/*
 * 状态模式
 *
 * date:2023-9-16
*/

#include "httpAnalyze.h"

int main()
{
    State* line = new RequestLine();
    State* header = new RequestHeader();
    State* blankLine = new RequestBlankLine();
    State* body = new RequestBody();

    HttpAnalyze* h = new HttpAnalyze();

    cout << "开始解析请求报文" << endl;

    h->setCurState(line);
    h->analyze();

    h->setCurState(header);
    h->analyze();

    h->setCurState(blankLine);
    h->analyze();

    h->setCurState(body);
    h->analyze();

    cout << "解析完毕" << endl;

}

运行结果:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++状态模式:State Pattern 的相关文章

  • 状态设计模式

    目录 前言 状态机原理 状态机的实现方式一 分支逻辑法 状态机实现方式二 查表法 状态机实现方式三 状态模式 总结 参考资料 前言 在实际的软件开发中 状态模式并不是很常见 但是在能够用到的场景里 可以发挥比较大的作用 状态模式一般用来实现
  • C++外观模式:Facade Pattern

    装饰者 不改变接口 但加入责任 适配器 将一个接口转换成另一个接口 外观 让接口更简单 外观模式 将一个或数个类的复杂的一切都隐藏在背后 只显露出一个干净美好的外观 外观模式提供了一个统一的接口 用来访问子系统中的一群接口 外观模式定义了一
  • C++建造者模式:Builder Pattern

    建造者模式又称生成者模式 该模式是一种创建型设计模式 能够分步骤创建复杂对象 该模式允许使用相同的创建代码通过不同的创建过程生成不同类型的对象 建造者模式 Builder 所构建的对象一定是庞大而复杂的 并且一定是按照既定的制造工序将组件组
  • 【GitHubShare】Web 前后端开发、以太坊基础、智能合约、密码学、数据分析

    区块链开发指南 作者通过 NFT 进行募资 然后将资金用于激励社区创作 让参与教程编写的人都能获益 从项目创建之初 教程便一直保持开放 GitHub github com dcbuild3r blockchain development g
  • 05_Vue基础入门

    vue的作用 渐进式的前端框架 里面的框架按需获取 vue特点 1 解耦视图和数据 2 双向数据绑定 3 可复用的组件 常用的按钮和表格 4 前端路由数据 页面跳转 5 状态管理 6 虚拟DOM 引入方式 1 使用CDN连接引入 加载速度更
  • 设计模式学习(五):State状态模式

    目录 一 什么是State模式 二 State模式示例程序 2 1 伪代码 2 1 1 不使用State模式的伪代码 2 1 2 使用State模式的伪代码 2 2 各个类之间的关系 2 3 State接口 2 4 DayState类 2
  • State:状态模式

    某个对象有一个标准接口 同时 该对象可能处于各种状态下 当该对象处于不同状态下时 客户调用标准接口 该对象会产生不同的响应 即允许一个对象在其内部状态改变时改变它的行为 使对象看起来似乎修改了它的类 这就是状态模式 例如 电灯开关这个对象提
  • java设计模式——状态模式

    状态模式的定义 一个对象在其内部状态改变的时候改变其行为 状态驱动 由上下文负责 代替if else 代替 switch case 普通方式 public String orderState String state if state eq
  • C++装饰者模式:Decorator Pattern

    设计原则 类应该对扩展开发 对修改关闭 装饰者可以在所委托被装饰者的行为之后加上自己的行为 以达到特定的目的 装饰者模式 动态地将责任附加到对象上 若要扩展功能 装饰者提供了比继承更有弹性的替代方案 装饰者和被装饰者必须是一样的类型 也就是
  • 设计模式_19 状态模式(含 UML图 和 C++代码)

    设计模式 19 状态模式 19 状态模式 19 1 概念 19 2 结构 19 3 实现 19 3 1 UML图 19 3 2 代码 19 3 3 测试结果 19 4 优缺点 19 4 1 优点 19 4 2 缺点 19 5 使用场景 re
  • vue3对echarts的二次封装之按需加载

    欢迎点击领取 前端面试题进阶指南 前端登顶之巅 最全面的前端知识点梳理总结 分享一个使用比较久的 效果展示 1 echarts是我们后台系统中最常用的数据统计图形展示 外界对它的二次封装也不计层数 2 在业务代码内每次的初始dom和绑定se
  • 设计模式:状态机模式

    首先状态机模式是处理一个类在内部状态改变的时候 其方法处理信息的模式也会改变 这里说一个在RTS游戏里的应用 有限状态机 我们要赋予每个战斗单位一个智能 比如一定范围内检测到地方单位 且自身处于游荡或者Patrol状态 那么就转换为攻击状态
  • 前端架构的艺术:解决问题、优化体验和提升效率

    引言 在当今的互联网时代 前端开发的重要性日益凸显 前端架构 作为前端开发的核心 关乎着产品的用户体验 性能和可维护性 本文将带你探讨前端架构的重要性和应用场景 分析各种前端架构的优缺点 并展示一个实际的前端架构解决方案 通过本文 你将获得
  • 【GOF23设计模式】_状态模式_UML状态图_酒店系统房间状态_线程对象状态切换JAVA250

    来源 http www bjsxt com 一 S03E250 01 GOF23设计模式 状态模式 UML状态图 酒店系统房间状态 线程对象状态切换 package com test state public interface State
  • 【TS第三讲】完善TS开发环境

    文章目录 写在前面 ts node nodemon nodemon文件类型 nodemon文件范围 写在最后 写在前面 探索TypeScript世界 驭Vue3 Ts潮流 开启前端之旅 欢迎来到前端技术的精彩世界 无论你是刚刚踏入编程大门的
  • C++代理模式:Proxy Pattern

    代理模式 为另一个对象提供一个替身或者占位符以控制对这个对象的访问 这样做的好处是 可以在目标对象实现的基础上 增强额外的功能操作 即扩展目标对象的功能 代理需要做的 控制和管理访问 需要时可以扩展目标对象的功能 被代理的对象可以是远程的对
  • State(状态模式)行为型

    状态模式 一 概述 二 结构 三 实例 四 适用场景 五 优缺点 一 概述 描述 一天有早中晚 不同时间下 太阳光是不一样的 所以随着早中晚的状态变化 太阳的行为也随着变化 定义 状态模式是一种行为设计模式 让你能在一个对象的内部状态变化时
  • 【设计模式】用Java实现状态模式

    一 状态模式介绍与使用场景 状态模式是一种行为设计模式 它允许对象在内部状态发生改变时改变其行为 该模式将对象的行为包装在不同的状态类中 使得对象的行为可以根据其当前状态动态改变 状态模式通常由以下几个角色组成 环境类 Context 环境
  • 每天10个前端小知识 <Day 7>

    前端面试基础知识题 1 什么是尾调用优化和尾递归 尾调用的概念非常简单 一句话就能说清楚 就是指某个函数的最后一步是调用另一个函数 function f x return g x 上面代码中 函数f的最后一步是调用函数g 这就叫尾调用 尾调
  • 新手也能看懂的【前端自动化测试入门】

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 3k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自

随机推荐

  • win10的哪个版本最好用?

    自2015年以来 win10系统发布过不少版本 这也让很多用户很迷茫 具体哪个版本好用 还要看个人使用习惯 下面好系统U盘启动就来给大家把1803 1709 1703 1607 1511几个版本做一下简单比较 Win 1803版 1803感
  • 微信小程序中生成普通二维码,并根据二维码里的参数跳转对应的页面

    微信小程序中生成普通二维码 并根据二维码里的参数跳转对应的页面 1 打开 微信公众平台 https mp weixin qq com 使用encodeURIComponent 对参数进行转码 第一步 对要传递的参数进行编码 第二步 生成二维
  • 微信WeixinJSBridge API使用实例

    企业号开发者中心 Weixin JS接口 http qydev weixin qq com wiki index php title WeixinJS E6 8E A5 E5 8F A3 oldid 287 来源 http www jb51
  • 课时 11:可观测性:你的应用健康吗?(莫源)

    本次课程的分享主要围绕以下五个部分 介绍一些整体需求的来源 介绍在 K8s 中 Liveness 和 Readiness 的使用方式 介绍在 K8s 中常见问题的诊断 应用的远程调试的方式 课程的总结与实践 需求来源 首先来看一下 整个需求
  • vue项目中自定义icon图标

    vue项目中有时需要用到自定义图标 用法如下 新建icon css文件 定义图标及其名称 指针图标 icon pointer background url assets images pointer png no repeat center
  • 渲染线程运行-大象无形11.1.2

    将目光转移到RenderingThreadMain 函数 这是个任务系统 各种渲染任务在此执行 1 通过ENQUEUE RENDER COMMAND向队列添加渲染任务 可见 有很多种渲染任务 二 查看其定义 1 2 查看EnqueueUni
  • 【附源码】计算机毕业设计SSM物流库存管理系统

    项目运行 环境配置 Jdk1 8 Tomcat7 0 Mysql HBuilderX Webstorm也行 Eclispe IntelliJ IDEA Eclispe MyEclispe Sts都支持 项目技术 SSM mybatis Ma
  • 【翻译】fancyBox 3中文文档

    fancyBox3 中文文档 译文永久地址 https kangkai124 github io fancybox 说明 本文档仅供参考 更新不及时请查看官方文档 1 介绍 fancyBox是一个JavaScript库 它以优雅的方式展示图
  • 深入学习jquery源码之before()和after()

    深入学习jquery源码之before 和after after content fn 概述 在每个匹配的元素之后插入内容 参数 content String Element jQuery 插入到每个目标后的内容 function Func
  • java pingpong_面试题。线程pingpong的输出问题

    第一种情况 public class Main public static void main String args Thread t new Thread public void run pong t run System out pr
  • springboot项目部署到服务器

    1 部署方式 Springboot 部署会采用两种方式 全部打包成一个jar 或者打包成一个war 2 打包成 jar 第一种方法 IDEA 1 clean 2 package 第二种方法 命令行 键盘输入 windows r cd 命令切
  • 用爬虫保存文章到TXT文件丨Python爬虫实战系列(7)

    个人主页 互联网阿星 格言 选择有时候会大于努力 但你不努力就没得选 作者简介 大家好我是互联网阿星 和我一起合理使用Python 努力做时间的主人 如果觉得博主的文章还不错的话 请点赞 收藏 留言 支持一下博主哦 行业资料 PPT模板 简
  • win10 使用量产工具后usb无法 识别硬件修复 Intel(R) 6 Series/C200 Series Chipset Family USB Enhanced Host Contro

    win10 使用量产工具后usb无法 识别硬件 设备出错 Intel 6 Series C200 Series Chipset Family USB Enhanced Host Controller 1c2d 感叹号 搜索问题网上都是win
  • SpringCloud微服务部署到docker上

    1 docker相关命令 前提是在linux系统中下载好docker 和docker拉取java 进程相关命令 systemctl start docker 开启docker服务 systemctl stop docker 停止docker
  • 分布式.数据库架构(Mysql 就这么点东西,分库分表读写分离集群演化)

    缘起 讲个创业故事 某一天老总想做一个HR的Saas系统 其中员工信息表 但不同员工信息表有一部分是相同的 也有一部分不同的 我们就把不同的放在一个json字段 Mysql 8 0以后支持 中 Dao用的Mybatis 以及MybatisG
  • 谷粒商城P47跨域一直报403无法解决

    1 在gulimall gateway中创建一个Cros的配置类 进行跨域配置 注意 springboot 2 4 0以前使用 addAllowedOrigin 进行配置 在此版本之后使用addAllowedOriginPattern 新的
  • J2EE中常用的名词进行解释

    web容器 给处于其中的应用程序组件 JSP SERVLET 提供一个环境 使JSP SERVLET直接更容器中的环境变量接口交互 不必关注其它系统问题 主要有WEB服务器来实现 例如 TOMCAT WEBLOGIC WEBSPHERE等
  • RBAC浅谈(一)RBAC的基本概念

    1 概念 RBAC即Role Based Access Control 意为基于角色的访问控制 用户与角色相关联 当用户在系统进行注册时可以选择成为某一角色从而拥有这个角色的权限 当然新注册的用户的权限也可以由上一级用户授予如管理员认定某个
  • mysql不是内部或外部命令,也不是可运行的程序或批处理文件解决

    依次排查原因 1 首先可能是环境变量没有配好 cmd命令行是需要环境变量的 右击我的电脑 高级系统设置 环境变量 系统变量 Path 点击 添加MySQL的bin目录 我这里的bin目录是 添加完毕后 2 启动cmd 注意这里要用管理员启动
  • C++状态模式:State Pattern

    状态模式 允许对象在其内部状态改变时改变它的行为 对象看起来好像修改类它的类 状态模式是有限状态机 Finite State Machine 的一种实现方式 我们都知道 http请求报文由请求行 请求头 请求空行和请求体四部分组成 服务器在