策略模式
-
通过算法封装独立的策略中,使算法可以互相替换,从而运行时动态选择不同的行为
-
过程:
-
将算法进行抽象策略封装 ,派生出具体的策略类进行实现不同的算法;
-
封装数据处理上下文类 ,可以设置不同的策略 ,对数据进行不同的处理
-
-
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---->管线化处理,先到先处理、响应
