YTKNetwork中的命令模式
今天开发中,遇到一个新框架 YTKNetwork
.下午抽空,读了一下源码.比较感兴趣的就是作者提到的设计模式.特简单记录一下自己的理解.
对比传统方式
对于我来说,比较熟悉的方式是对AFNetworking
进行一层封装.然后在block
中,对返回数据进行派发.
而YTKNework
的方式,应用了命令模式.将请求的必要细节都封装到了一个请求对象中.
其实这本身就是命令模式的初衷,行为的请求者(发起网络请求的)往往会和行为的实现者(实现网络请求的,比如AFNetworking
)耦合.由于这种耦合关系的存在,这个行为往往无法复用,撤销或者重做.
优点
因为封装成了对象,那么就可以使用集合对这些对象进行管理,也就是说,可以比较方便的进行排队,取消,调整优先级等操作.
命令模式UML
首先,一个GoF的命令模式的UML图如下.
角色职责
Client
创建ConcreteCommand
对象并设定其receiver
;
Invoker
要求通用命令(最终其实是到了ConcreteCommand
) 实施请求
Command
是Invoker
依赖的接口
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.按需进行回调