前言
在Objective-C中蒋伦,protocol和繼承區(qū)別還是蠻大的:
? ?@interface TestClass : TestFatherClass <TestProtocol>@end
講的是,一個(gè)類(lèi)TestClass谨湘,是繼承自類(lèi)TestFatherClass的子類(lèi),并遵守TestProtocol協(xié)議息罗。
在Swift中芋齿,就看不出來(lái)了:
? class TestClass : TestFatherClass , TestProtocol { ? }
也就是說(shuō)在swift中面相協(xié)議更加被看重了,面向?qū)ο缶幊趟枷氲幕A(chǔ)上侍匙,更加推薦面向協(xié)議編程的思想了氮惯。
協(xié)議是什么?
首先跳出編程想暗,協(xié)議是什么妇汗?
場(chǎng)景描述:甲方乙方為了實(shí)現(xiàn)一個(gè)目標(biāo)A,擬定了協(xié)議B说莫,雙方承諾共同遵守協(xié)議杨箭,協(xié)議B中提到,場(chǎng)景C的時(shí)候储狭,遵守協(xié)議的人要做D這件事互婿。
現(xiàn)在甲方遇到了場(chǎng)景C,在遵守協(xié)議的原則下辽狈,甲方做了D這件事慈参,最終甲方的目標(biāo)A實(shí)現(xiàn)了。
當(dāng)然這是非常理想的狀況刮萌。
那么iOS的協(xié)議是什么呢驮配?
A protocol declares a programmatic interface that any class may choose to implement. Protocols make it possible for two classes distantly related by inheritance to communicate with each other to accomplish a certain goal. They thus offer an alternative to subclassing. Any class that can provide behavior useful to other classes may declare a programmatic interface for vending that behavior anonymously. Any other class may choose to adopt the protocol and implement one or more of its methods, thereby making use of the behavior. The class that declares a protocol is expected to call the methods in the protocol if they are implemented by the protocol adopter.
實(shí)際上是一樣的:
甲方類(lèi)和乙方類(lèi)為了實(shí)現(xiàn)功能A,遵守了協(xié)議B着茸,協(xié)議B中有方法D壮锻,是在場(chǎng)景C的情況下要做D這件事。
那么在場(chǎng)景C的時(shí)候涮阔,D方法被執(zhí)行了猜绣,最終實(shí)現(xiàn)了功能A。
有點(diǎn)繞是不是澎语?
用對(duì)象和協(xié)議實(shí)現(xiàn)同一個(gè)詳細(xì)的場(chǎng)景(有點(diǎn)啰嗦途事,但是非常實(shí)際的例子)
舉個(gè)更詳細(xì)一點(diǎn)的例子:
有按鈕A,對(duì)應(yīng):人類(lèi)小明
現(xiàn)在要實(shí)現(xiàn)需求:點(diǎn)擊按鈕的時(shí)候擅羞,打印對(duì)應(yīng)類(lèi)的對(duì)應(yīng)名字+“你好尸变!”
umm...怎么實(shí)現(xiàn)呢?界面好說(shuō)减俏,刷刷刷就寫(xiě)好了A按鈕召烂。點(diǎn)擊事件怎么寫(xiě)呢?首先考慮的應(yīng)該是對(duì)象娃承。
寫(xiě)一個(gè)類(lèi)奏夫,是人類(lèi)怕篷,屬性有名字,方法有打招呼酗昼。小明是人類(lèi)廊谓,名字是小明,實(shí)現(xiàn)方法打招呼:打印“{.名字}你好麻削!”
ok蒸痹,需求解決了,歇了口氣呛哟,so easy!
第二天叠荠,需求改了:
有按鈕A兩個(gè),對(duì)應(yīng):人類(lèi)小明扫责;人類(lèi)小紅榛鼎,她的昵稱(chēng)是紅紅。
現(xiàn)在要實(shí)現(xiàn)需求:點(diǎn)擊按鈕的時(shí)候鳖孤,打印對(duì)應(yīng)類(lèi)的對(duì)應(yīng)名字+“你好者娱!”,小明顯示小明淌铐,小紅顯示紅紅肺然。
****!產(chǎn)品經(jīng)理拖出去槍斃腿准!小明和紅紅是什么鬼?為什么不打印小紅呢拾碌?算了吐葱,強(qiáng)壓怒火,改改改:
人類(lèi)這個(gè)類(lèi)里添加屬性:昵稱(chēng)校翔,打招呼的時(shí)候添加判斷弟跑,如果昵稱(chēng)不為空,顯示昵稱(chēng)防症,如果昵稱(chēng)為空孟辑,顯示名字
哼哼,難不倒我的蔫敲,再次解決饲嗽。
第三天,需求又變了:
有按鈕A3個(gè)奈嘿,對(duì)應(yīng):人類(lèi)小明貌虾;人類(lèi)小紅,她的昵稱(chēng)是紅紅裙犹;小狗小花尽狠。
現(xiàn)在要實(shí)現(xiàn)需求:點(diǎn)擊按鈕的時(shí)候衔憨,打印對(duì)應(yīng)類(lèi)的對(duì)應(yīng)名字+“你好!”袄膏,小明顯示小明践图,小紅顯示紅紅,小狗顯示小花沉馆。
********平项!給產(chǎn)品經(jīng)理扎個(gè)娃娃,天天刺刺刺悍及!不過(guò)飯碗不能丟闽瓢,依然要實(shí)現(xiàn)它:
代碼不能太難看,重構(gòu)一下心赶,動(dòng)物類(lèi)扣讼,屬性:名字,方法:打招呼(打印“{.名字}你好缨叫!”)椭符,人類(lèi),繼承自動(dòng)物類(lèi)(人也是動(dòng)物嘛)耻姥,屬性多一個(gè)昵稱(chēng)销钝,在打招呼方法添加判斷,如果昵稱(chēng)是空琐簇,super蒸健,如果昵稱(chēng)不為空,打印“{.昵稱(chēng)}你好婉商!”
寫(xiě)完之后就開(kāi)始擔(dān)心了似忧,如果哪一天產(chǎn)品經(jīng)理突發(fā)奇想添加個(gè)汽車(chē)按鈕怎么辦?撞死算了丈秩。他應(yīng)該不會(huì)那么無(wú)情無(wú)恥無(wú)理取鬧吧盯捌?
呵呵,偏偏第四天蘑秽,產(chǎn)品經(jīng)理告訴你饺著,他就是這么無(wú)情無(wú)恥無(wú)理取鬧,汽車(chē)不錯(cuò)肠牲,就加個(gè)汽車(chē)好了幼衰!
有按鈕A4個(gè),對(duì)應(yīng):人類(lèi)小明埂材;人類(lèi)小紅塑顺,她的昵稱(chēng)是紅紅;小狗小花;大眾汽車(chē)严拒,他的種類(lèi)是高爾夫扬绪,型號(hào)是xyz123。
現(xiàn)在要實(shí)現(xiàn)需求:點(diǎn)擊按鈕的時(shí)候裤唠,打印對(duì)應(yīng)類(lèi)的對(duì)應(yīng)名字+“你好挤牛!”,小明顯示小明种蘸,小紅顯示紅紅墓赴,小狗顯示小花,汽車(chē)顯示高爾夫xyz123航瞭。
是不是覺(jué)得這樣下去不是個(gè)事了诫硕?單純面向?qū)ο箝_(kāi)發(fā)似乎已經(jīng)不足以快速實(shí)現(xiàn)需求了,每次更迭如果脫離現(xiàn)有的數(shù)據(jù)結(jié)構(gòu)刊侯,就會(huì)有重構(gòu)的必要章办,時(shí)間成本和調(diào)試成本大大增加,協(xié)議這個(gè)東西的作用體現(xiàn)出來(lái)了
協(xié)議:對(duì)它打招呼滨彻,有一個(gè)屬性:稱(chēng)呼
點(diǎn)擊事件打优航臁:{遵守協(xié)議:對(duì)它打招呼的類(lèi)的稱(chēng)呼}+“你好!”
人類(lèi)亭饵,名字小明休偶;人類(lèi),名字小紅辜羊,昵稱(chēng)紅紅踏兜。
想要對(duì)他們打招呼只要讓人類(lèi)遵守協(xié)議:對(duì)它打招呼,然后賦值時(shí)候只冻,順便判斷下庇麦,如果昵稱(chēng)不為空,就讓稱(chēng)呼是昵稱(chēng)喜德,如果昵稱(chēng)為空,就讓稱(chēng)呼是名字垮媒。
ok舍悯,管他加小狗還是汽車(chē)呢,只要讓它遵守協(xié)議:對(duì)它打招呼睡雇,把產(chǎn)品經(jīng)理打招呼的時(shí)候要顯示的稱(chēng)呼給“稱(chēng)呼”賦值萌衬,要來(lái)多少都沒(méi)事了。
總結(jié)
你如果覺(jué)得你的產(chǎn)品經(jīng)理沒(méi)這么坑它抱,我覺(jué)得你還是預(yù)防萬(wàn)一為好秕豫,我維護(hù)一個(gè)2年的產(chǎn)品,為了滿(mǎn)足多變的需求,定制了無(wú)數(shù)協(xié)議混移,現(xiàn)在看起來(lái)真的很好維護(hù)祠墅。
對(duì)象繼承的特點(diǎn):實(shí)現(xiàn)起來(lái)容易,但是擴(kuò)展和維護(hù)麻煩
協(xié)議的特點(diǎn):實(shí)現(xiàn)起來(lái)要定制協(xié)議歌径,可能有點(diǎn)麻煩毁嗦,但是耦合性非常低,利于維護(hù)回铛,擴(kuò)展性很強(qiáng)狗准。
能用協(xié)議的地方,還是多用吧