基于策略模式的应用层协议支持

策略模式

  • 通过算法封装独立的策略中,使算法可以互相替换,从而运行时动态选择不同的行为

  • 过程:

    • 将算法进行抽象策略封装 ,派生出具体的策略类进行实现不同的算法;

    • 封装数据处理上下文类 ,可以设置不同的策略 ,对数据进行不同的处理

  • eg

    • 多态:基类指针---->派生类,可以不断拓展,通过set策略方法进行色设置以及切换

核心要素:

  • 抽象策略类:主要用于定义策略接口,规定所有具体的策略类必须实现的方法

  • 具体策略:每个具体的策略类在该方法中分装实现具体的算法或行为

  • 上下文类:内部包含一个策略对象的引用,通过该引用调用策略

策略模式的优点

  • 开闭原则:可以在不修改原有代码的情况下增加新的策略

  • 避免多重条件语句:消除复杂的条件判断

  • 提高代码复用性:策略可以独立测试和复用

  • 运行时切换,可以在运行时动态改变对象的行为

设计:

  • 抽象:

    • Protocol协议类:

      • 请求处理操作

      • 响应处理操作

      • 设置连接上下文对象

    • Controller上下文控制类

      • 基于当前连接的不同状态,对接收到的请求和响应进行不同的处理

      • 设置给TcpConnection中的context(上下文对象)内容,解决请求数据不完整的处理

        • 上下文的作用

          • 标记当前连接处于状态

          • 应该对当前收到状态的数据进行什么处理

      • 必要性

        • 连接接收到数据就会调用onMessageCallback进行消息回调处理

          • 以前的tcp服务器和客户端,不关注数据的边界(tcp的粘包问题 )

          • 但是到了应用层就不可以,因为应用层需要对数据进行完整的业务处理了,必须拿到完整请求才能进行处理

      • 实现函数:(服务端)

        • 接收请求数据

        • 判断请求数据是否接受完整

        • 发送响应数据

        • 管理数据重置接口

    • 消息处理

      • 抽象为Mesage类 :作为请求数据和响应数据 的管理基类

      • 规定策略接口

        • 接收并解析数据

        • 判断数据接收处理是否完整

        • 序列化并发送数据

抽象处理流程

  • 抽象协议类:给连接的Connection设置上下文对象;请求处理;响应处理

  • 抽象上下文类:

    • 服务端:接收请求,接收是否完毕;发送响应,响应是否发送完毕

    • 客户端:发送请求,请求是否发送完毕;接收响应,响应是否接收完毕

  • 抽象的消息类

    • 接收数据,接收数据是否完整;发送数据,发送数据是否完毕

从抽象协议类 派生出HTTP协议类:设置HTTP协议上下文;处理HTTP请求;处理HTTP响应

从抽象上下文类 派生出HTTP上下文类:

  • 服务端:接收HTTP请求,请求是否接收完毕;发送HTTP响应,响应是否发送完毕

  • 客户端:发送HTTP请求,请求是否发送完毕;接收HTTP响应,响应是否接收完毕

从抽象消息类中派生出HTTP请求数据类 :

  • 请求消息类:

    • 成员:请求方法、协议版本、资源路径、头部字段、查询字段、请求正文

    • 方法:recvfrom接收并解析请求;recvComplated;sendTo序列化并发送请求;sendToComplated

  • 响应消息类

    • 成员:响应状态码、协议版本、响应正文、响应头部字段

    • 方法:recvFrom接收并解析响应;recvComplated;sendTo序列化并发送响应;sendComplated;recvFrom接收并解析响应;

服务端总体流程处理

  • 实例化一个server对象:tcpServer对象(网络通信);httpPtotocol对象(数据业务处理)

    • 若新连接 到来:通过httpProtocol为connection新连接设置上下文对象HttpController(request,response)

    • 若新消息到来:从连接获取上下文对象,调用protocol->handleRequest()

      • handleRequest()->找出上下文httpController对象

        • request->recvFrom()接收并解析请求

        • request->recvComplated()

        • dispath(request,responds)--->针对request里面的数据进行业务处理/index.html将处理结果以及要响应的数据放到respose中

        • response->sendTo();发送响应

        • response->sendComplated();

        • controller->reset();重置

客户端处理流程

主动操作:发送请求;

被动操作:接收到响应之后处理

  • 实例化一个client对象:TcpClient(TcpConnection)、HttpProtocol协议对象,请求信息队列

    • 发送请求

      • http_protocol->send(connection,httpRequest,设置响应回调函数)

        • 构造请求信息 《响应回调函数,上下文对象》,添加到请求信息队列中

        • 针对请求进行序列化 ,通过connection将请求数据发送给服务端(httpRequest中有sendTo)

    • 收到响应后的处理:

      • 从connection中取出上下文对象httpController《httpResponse(空的)》

      • response->recvFrom(buffer)接收并解析响应数据

      • response->recvComplated();判断接收响应是否完整

    • 从请求信息队列中,取出队头节点(有《响应回调函数,上下文对象》)

    • 使用请求队列中的回调函数 ,对反序列化 后的httpResponse对象进行响应处理

请求信息队列--->send可能是非阻塞的,每个请求都对应着自己的响应回调函数

http---->管线化处理,先到先处理、响应

相关推荐
AlanAshley4 天前
四种镜像文件在各操作系统的使用用法及区别
策略模式·虚拟机
拆房老料6 天前
【第四部分:Agentic 智能体设计模式】17. Agent 路由模式详解:从意图识别到动态模型选择
java·设计模式·ai编程·策略模式
zhangfeng11338 天前
com.apple.quarantine 并不是乱码,而是 macOS Gatekeeper 给下载文件自动打上的“隔离属性
macos·策略模式
lpfasd12310 天前
Ollama 还是 LM Studio:在 24GB 的 M6 Mac 上,我把 Ollama 卸载了
macos·策略模式
福大大架构师每日一题12 天前
ollama v0.40.11发布:macOS原生语音生成上线,d3决策模型正式加入
macos·策略模式
AIex-YH14 天前
发酵罐里点一盏灯:光发酵,正在重算微藻蛋白的成本账
运维·制造·策略模式
snakecy15 天前
macOS 安装 LaTeX 全流程指南:从 MacTeX 到中文排版
macos·策略模式
钱栈up19 天前
从 macOS 切回 Windows,我用 5 个免费工具把 80% 操作习惯搬了回来
windows·macos·策略模式
kunicoding22 天前
C++ 策略模式实战:写一个可以“一键换输出“的日志系统
开发语言·c++·策略模式
峥嵘life22 天前
Android16 开机后立即打开相机闪退问题分析与解决总结
android·开发语言·数码相机·策略模式