YTKNetwork中的命令模式

YTKNetwork中的命令模式

今天开发中,遇到一个新框架 YTKNetwork .下午抽空,读了一下源码.比较感兴趣的就是作者提到的设计模式.特简单记录一下自己的理解.

对比传统方式

对于我来说,比较熟悉的方式是对AFNetworking进行一层封装.然后在block中,对返回数据进行派发.

YTKNework的方式,应用了命令模式.将请求的必要细节都封装到了一个请求对象中.

其实这本身就是命令模式的初衷,行为的请求者(发起网络请求的)往往会和行为的实现者(实现网络请求的,比如AFNetworking)耦合.由于这种耦合关系的存在,这个行为往往无法复用,撤销或者重做.

优点

因为封装成了对象,那么就可以使用集合对这些对象进行管理,也就是说,可以比较方便的进行排队,取消,调整优先级等操作.

命令模式UML

首先,一个GoF的命令模式的UML图如下.

15051227462886.jpg

角色职责

Client 创建ConcreteCommand对象并设定其receiver;
Invoker 要求通用命令(最终其实是到了ConcreteCommand) 实施请求
CommandInvoker依赖的接口
ConcreteCommand负责隔离Receiver和它的操作action.
Receiver是可以随着由Command(ConcreteCommand)对象实施相应请求,而执行实际操作的任何对象.

在YTKRequest中角色对应

Client : ViewController/ViewModel
Invoker: YKTNetworkAgent
Command: YTKBaseRequest
ConcreteCommand: CustomRequest
Receiver: AFNetworking

在角色中,Client需要知道Receiver并配置到ConcreteCommand中,所以才有了关系2(关联关系),而在YTKRequest中,这个Receiver是唯一的AFNetworking.所以将关系沉入到了框架内部.也就是我们的Client不需知道这个细节.所以2这个线,是不需要的.

整个流程就是:

1.在Client(ViewController或者ViewModel)中组装遵循Commnad(YTKBaseReuqest)协议(这里是继承)的ConcreteCommand(YTKBaseRequest的子类).
2.Invoker(YTKNetworkAgent)将Command加入队列,按需调用Command(YTKBaseReuqest),找到ConcreteCommand(YTKBaseRequest的子类)
3.ConcreteCommand调用找到Recevier(AFNetworking)执行action(网络请求)
4.按需进行回调

你可能感兴趣的:(YTKNetwork中的命令模式)