YTKNetwork中的命令模式
今天開發(fā)中,遇到一個新框架 YTKNetwork
.下午抽空,讀了一下源碼.比較感興趣的就是作者提到的設計模式.特簡單記錄一下自己的理解.
對比傳統(tǒng)方式
對于我來說,比較熟悉的方式是對AFNetworking
進行一層封裝.然后在block
中,對返回數(shù)據進行派發(fā).
而YTKNework
的方式,應用了命令模式.將請求的必要細節(jié)都封裝到了一個請求對象中.
其實這本身就是命令模式的初衷,行為的請求者(發(fā)起網絡請求的)往往會和行為的實現(xiàn)者(實現(xiàn)網絡請求的,比如AFNetworking
)耦合.由于這種耦合關系的存在,這個行為往往無法復用,撤銷或者重做.
優(yōu)點
因為封裝成了對象,那么就可以使用集合對這些對象進行管理,也就是說,可以比較方便的進行排隊,取消,調整優(yōu)先級等操作.
命令模式UML
首先,一個GoF的命令模式的UML圖如下.
角色職責
Client
創(chuàng)建ConcreteCommand
對象并設定其receiver
;
Invoker
要求通用命令(最終其實是到了ConcreteCommand
) 實施請求
Command
是Invoker
依賴的接口
ConcreteCommand
負責隔離Receiver
和它的操作action
.
Receiver
是可以隨著由Command(ConcreteCommand)
對象實施相應請求,而執(zhí)行實際操作的任何對象.
在YTKRequest中角色對應
Client
: ViewController/ViewModel
Invoker
: YKTNetworkAgent
Command
: YTKBaseRequest
ConcreteCommand
: CustomRequest
Receiver
: AFNetworking
在角色中,Client
需要知道Receiver
并配置到ConcreteCommand
中,所以才有了關系2(關聯(lián)關系),而在YTKRequest
中,這個Receiver
是唯一的AFNetworking
.所以將關系沉入到了框架內部.也就是我們的Client
不需知道這個細節(jié).所以2這個線,是不需要的.
整個流程就是:
1.在Client
(ViewController
或者ViewModel
)中組裝遵循Commnad
(YTKBaseReuqest
)協(xié)議(這里是繼承)的ConcreteCommand
(YTKBaseRequest
的子類).
2.Invoker
(YTKNetworkAgent
)將Command加入隊列,按需調用Command
(YTKBaseReuqest
),找到ConcreteCommand
(YTKBaseRequest
的子類)
3.ConcreteCommand
調用找到Recevier
(AFNetworking
)執(zhí)行action
(網絡請求)
4.按需進行回調