OC協(xié)議在解耦中的應(yīng)用

1,oc中利用協(xié)議代理解耦,
? ? delegate是OC中常用傳值模式,這是一種很好的設(shè)計(jì)模式。但是日常開發(fā)中僅限于傳值,不能充分發(fā)揮它的價(jià)值。其本質(zhì)是將接口與實(shí)現(xiàn)分離,下面是一種利用協(xié)議實(shí)現(xiàn)模塊解耦的思路。
2,重構(gòu)過程
? ? ? ? 1> 目標(biāo):① 項(xiàng)目移除任意業(yè)務(wù)模塊,編譯器不能報(bào)錯(cuò),甚至運(yùn)行期不報(bào)錯(cuò)。
? ? ? ? ? ? ? ? ? ? ? ? ?② 不允許硬編碼,不允許硬編碼,不允許硬編碼,,,
? ? ? ? 2> 思路。
? ? ? ? ? ? 利用協(xié)議聲明接口,在需要調(diào)用接口的地方只引入?yún)f(xié)議,然后通過中間層獲取該協(xié)議實(shí)現(xiàn)實(shí)例對(duì)象,調(diào)用接口。
? ? ? ? 3> 實(shí)現(xiàn)。
? ? ? ? ? ? 結(jié)構(gòu)上,我們劃分為 中間層,功能提供者,功能調(diào)用者。下面是實(shí)現(xiàn):
#pragma mark - ?聲明協(xié)議
我們以加載網(wǎng)絡(luò)圖片為例,先聲明協(xié)議接口。如下圖

協(xié)議這個(gè)要?dú)w結(jié)到公用層,看個(gè)人吧,我思考了很久,最后把它抽出來放在公用層,這是個(gè)值得思考的問題。
#pragma mark -??中間層
中間層的作用:記錄協(xié)議以及對(duì)應(yīng)遵守協(xié)議的實(shí)現(xiàn)類,當(dāng)調(diào)用者要獲取該協(xié)議對(duì)應(yīng)實(shí)現(xiàn)實(shí)例對(duì)象時(shí),通過記錄的類名生成實(shí)例對(duì)象返回給調(diào)用者。

中間層的結(jié)構(gòu)十分簡(jiǎn)單,只有一個(gè)字典屬性,是用來記錄Protocol 與對(duì)應(yīng)實(shí)現(xiàn)類名。上圖。

中間層對(duì)于實(shí)現(xiàn)協(xié)議類的注冊(cè)接口,傳入一個(gè)協(xié)議,一個(gè)類名,中間層會(huì)將兩個(gè)參數(shù)保存到字典中。上圖。

對(duì)于獲取delegate對(duì)象,調(diào)用者要傳入一個(gè)協(xié)議。中間層根據(jù)記錄的協(xié)議對(duì)應(yīng)的類名,初始化一個(gè)對(duì)象返回給調(diào)用者,這個(gè)對(duì)象一定是遵守傳入?yún)f(xié)議的。上圖。
至此中間層的任務(wù)完成,不依賴任何功能模塊。
#pragma mark -? ?功能提供者
功能提供者:引入要實(shí)現(xiàn)的協(xié)議,遵守協(xié)議并實(shí)現(xiàn)協(xié)議中的方法。在load中將自己實(shí)現(xiàn)的協(xié)議注冊(cè)到中間層。

#pragma mark -???功能調(diào)用者
功能調(diào)用者:根據(jù)要調(diào)用的功能,引入對(duì)應(yīng)的協(xié)議,通過中間層獲取實(shí)現(xiàn)該協(xié)議的實(shí)例對(duì)象,并調(diào)用協(xié)議中的接口。

至此我們就可以隨意更換webImage模塊,甚至直接刪掉這個(gè)模塊也不會(huì)報(bào)錯(cuò)。
完結(jié)撒花。