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

策略模式

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

  • 过程:

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

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

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

相关推荐
Java后端的Ai之路2 小时前
23、Python - 策略模式
linux·python·策略模式
程序员夏洛2 天前
什么是策略模式?一般用在什么场景?
策略模式
user_admin_god3 天前
数据采集/交换系统设计经验
spring boot·spring·策略模式
Nontee10 天前
Quartz 集群 + 策略模式:逾期预警推送系统设计实录
linux·服务器·策略模式
二炮手亮子11 天前
从 BIO、NIO、AIO 到多路复用与 Netty
策略模式·nio
cui_hao_nan12 天前
大模型负责“聪明“,策略模式负责“执行“:智能配图系统如何自动选择图片来源
策略模式·ai开发
阿萨德528号15 天前
npm 包发布实战指南:从零发布、更新迭代到版本治理
前端·npm·策略模式
AI人工智能+电脑小能手16 天前
大白话说Java设计模式-26-策略模式(业务实战篇)
java·spring·设计模式·策略模式·支付系统·算法切换
coding4u16 天前
Mac 多桌面(Spaces)的正确用法:你的屏幕可以大三倍
macos·docker·计算机外设·文件管理·策略模式