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

策略模式

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

  • 过程:

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

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

  • 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---->管线化处理,先到先处理、响应

相关推荐
智慧城市203019 小时前
关键供应商连续交付不合格批次,说明质量风险可能持续存在。企业需要建立“批次隔离、加严检验、驻厂遏制、复检放行、供应商升级”的处置闭环,同时统筹保供。
数据分析·策略模式·战略咨询·流程管理
happy_baymax2 天前
Dell G3 3590 黑苹果实战:OpenCore 1.0.8 + NullMoth 驱动让 GTX 1660 跑起 Metal
策略模式
遇码2 天前
macOS 触摸板捏合在 GPUI 里无响应:vendor 打补丁,把手势合成为 cmd+滚轮事件
rust·图形渲染·策略模式·桌面应用·gpui
mmsx3 天前
Android 架构分层:MVVM 与 MVP 共存,网络层怎么切
android·策略模式·mvvm·mvp
博风3 天前
7、设计模式应用举例:策略模式:加密、解密文件
设计模式·策略模式
mmsx3 天前
Android 本地优先的三级语义理解降级链
android·数码相机·策略模式
早点睡觉好了3 天前
LangChain 源码入门 02:消息、ChatPromptTemplate 与 Chat Model 调用链
ai·langchain·策略模式
花间相见4 天前
【计算基础|网络12】TCP 抓包与经典边界问题
网络·tcp/ip·策略模式
花间相见4 天前
【计算基础|网络11】TCP(下):拥塞控制与参数优化
网络·tcp/ip·策略模式
小羊没烦恼!5 天前
OS X 上使用.NET开发应用程序
开发语言·前端·数据库·人工智能·c#·策略模式