iOS設(shè)計(jì)模式四部曲(三):行為型模式 內(nèi)附Demo

本篇是四部曲的第三篇艳狐,第一篇請(qǐng)點(diǎn)這里iOS設(shè)計(jì)模式四部曲(一):創(chuàng)建型模式,第二篇請(qǐng)點(diǎn)擊這里iOS設(shè)計(jì)模式四部曲(二):結(jié)構(gòu)型模式定硝。由于個(gè)人能力有限,文中難免有一些遺漏或者錯(cuò)誤毫目,請(qǐng)各位看官不吝賜教蔬啡!謝謝!本文所有Demo可以在我的Git上獲取镀虐,請(qǐng)點(diǎn)擊這里

第三篇行為型模式
設(shè)計(jì)模式.png

上圖是整個(gè)設(shè)計(jì)模式的目錄箱蟆,這篇文章是其中的第三部分:行為型模式。行為型模式包括:責(zé)任鏈模式(Chain of Responsibility)刮便,命令模式(Command)空猜,中介者模式(Mediator)觀察者模式(Observer)恨旱,備忘錄模式(Memento)辈毯,策略模式(Strategy)訪問者模式(Visitor)搜贤,模板方法模式(TemplateMethod)谆沃,狀態(tài)模式(State)迭代器模式(Iterator)入客,解釋器模式(Interpreter)管毙。下面我們就開始吧~

責(zé)任鏈模式(Chain of Responsibility):

1.定義: 責(zé)任鏈模式(Chain of Responsibility Pattern)為請(qǐng)求創(chuàng)建了一個(gè)接收者對(duì)象的鏈。使多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求桌硫,從而避免了請(qǐng)求的發(fā)送者和接受者之前的耦合關(guān)系夭咬。將這些對(duì)象連成一條鏈,并沿著這條鏈傳遞該請(qǐng)求铆隘,知道有對(duì)象處理它為止卓舵。
2. 使用場景: 有多個(gè)對(duì)象可以處理同一個(gè)請(qǐng)求,具體哪個(gè)對(duì)象處理該請(qǐng)求由運(yùn)行時(shí)確定膀钠。
3. 具體實(shí)現(xiàn): 這里舉了一個(gè)實(shí)際中公司請(qǐng)假批假的例子掏湾,具體請(qǐng)點(diǎn)擊這里查看
4.優(yōu)點(diǎn): 1.低耦合:將請(qǐng)求和處理分開,請(qǐng)求者可以不用知道是誰處理的肿嘲。2.新增和修改新的處理類比較容易
5.缺點(diǎn): 每個(gè)請(qǐng)求都是從鏈頭遍歷到鏈尾融击,如果鏈比較長會(huì)產(chǎn)生一定的性能問題,調(diào)試起來也比較麻煩雳窟。
6.注意事項(xiàng): 避免超長鏈的情況出現(xiàn)


命令模式(Command):

1.定義: 命令模式將請(qǐng)求封裝成對(duì)象尊浪,從而可用不同的請(qǐng)求對(duì)客戶進(jìn)行參數(shù)化,對(duì)請(qǐng)求排隊(duì)或記錄請(qǐng)求日志封救,以及支持可撤銷和恢復(fù)的操作拇涤。
2. 使用場景: 在某些場合,比如要對(duì)行為進(jìn)行"記錄誉结、撤銷/重做鹅士、事務(wù)"等處理的時(shí)候。
3. 具體實(shí)現(xiàn): YTKNetwork就是用的命令模式惩坑,推薦大家學(xué)習(xí)掉盅。這里我舉了一個(gè)吃飯點(diǎn)菜的例子,具體請(qǐng)點(diǎn)擊這里查看
4.優(yōu)點(diǎn): 1.類間解耦:調(diào)用者與接收者之間沒有任何依賴關(guān)系以舒。2.擴(kuò)展性良好:新的命令可以很容易添加到系統(tǒng)中去怔接。
5.缺點(diǎn): 使用命令模式可能會(huì)導(dǎo)致系統(tǒng)有過多的具體命令類。


中介者模式(Mediator):

1.定義: 中介者模式就是用一個(gè)中介對(duì)象來封裝一系列的對(duì)象交互稀轨,中介者使各對(duì)象不需要顯式地相互引用扼脐,從而使其耦合松散,而且可以獨(dú)立地改變它們之間的交互奋刽。
2. 使用場景: 多個(gè)類相互依賴瓦侮,形成了網(wǎng)狀結(jié)構(gòu)的時(shí)候可以考慮使用中介者模式。
3. 具體實(shí)現(xiàn): 這里舉了一個(gè)聊天室的例子佣谐,具體請(qǐng)點(diǎn)擊這里查看
4.優(yōu)點(diǎn): 1.解耦:通過中介者模式肚吏,我們可以將復(fù)雜關(guān)系的網(wǎng)狀結(jié)構(gòu)變成結(jié)構(gòu)簡單的以中介者為核心的星形結(jié)構(gòu),每個(gè)對(duì)象不再和它與之關(guān)聯(lián)的對(duì)象直接發(fā)生相互作用狭魂,而是通過中介者對(duì)象來另一個(gè)對(duì)象發(fā)生相互作用罚攀。2.降低了類的復(fù)雜度党觅,將一對(duì)多轉(zhuǎn)化成了一對(duì)一。
5.缺點(diǎn):中介者模式在某些情況會(huì)膨脹得很大斋泄,而且邏輯復(fù)雜杯瞻,中介類越多越復(fù)雜,越難以維護(hù)炫掐。
6.注意事項(xiàng): 類之間的依賴關(guān)系是必然存在的魁莉,所以不一定有多個(gè)依賴關(guān)系的時(shí)候就考慮使用中介者模式。中介者模式適用于多個(gè)對(duì)象之間的緊密耦合的情況募胃,緊密耦合的定義標(biāo)準(zhǔn)是:在類圖中出現(xiàn)了蜘蛛網(wǎng)狀結(jié)構(gòu)旗唁,這種情況就要考慮使用中介者模式,中介者模式可以把蜘蛛網(wǎng)梳理成星型結(jié)構(gòu)痹束,使原本復(fù)雜混亂的關(guān)系變得清晰簡單检疫。


觀察者模式(Observer):

1.定義: 定義對(duì)象間的一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí)祷嘶,所有依賴于它的對(duì)象都得到通知并被自動(dòng)更新电谣。
2. 使用場景: 一個(gè)對(duì)象的狀態(tài)發(fā)生改變,所有的依賴對(duì)象都將得到通知的時(shí)候抹蚀。
3. 具體實(shí)現(xiàn): Objective-C中的通知以及KVO都是觀察者模式的具體實(shí)現(xiàn)剿牺。這里舉了一個(gè)找工作訂閱的例子,具體請(qǐng)點(diǎn)擊這里查看
4.優(yōu)點(diǎn): 1.觀察者和被觀察者是抽象耦合的环壤,擴(kuò)展比較方便晒来。2.建立一套觸發(fā)機(jī)制。
5.缺點(diǎn): 1.如果一個(gè)被觀察者對(duì)象有很多的直接和間接的觀察者的話郑现,將所有的觀察者都通知到會(huì)花費(fèi)很多時(shí)間湃崩。 2.如果在觀察者和觀察目標(biāo)之間有循環(huán)依賴的話,觀察目標(biāo)會(huì)觸發(fā)它們之間進(jìn)行循環(huán)調(diào)用接箫,可能導(dǎo)致系統(tǒng)崩潰攒读。 3.觀察者模式?jīng)]有相應(yīng)的機(jī)制讓觀察者知道所觀察的目標(biāo)對(duì)象是怎么發(fā)生變化的,而僅僅只是知道觀察目標(biāo)發(fā)生了變化辛友。


備忘錄模式(Memento):

1.定義: 在不破壞封裝性的前提下薄扁,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),并在該對(duì)象之外保存這個(gè)狀態(tài)废累。這樣以后就開獎(jiǎng)對(duì)象恢復(fù)到原先保存的狀態(tài)了邓梅。
2. 使用場景: 需要存檔的時(shí)候,比如說游戲中的存檔邑滨。
3. 具體實(shí)現(xiàn): 打游戲時(shí)的存檔日缨,數(shù)據(jù)庫的事務(wù)管理,SVN以及Git代碼的版本控制系統(tǒng)等等都可以說成是備忘錄模式的實(shí)例掖看。這里我簡單的舉了一下例子匣距,具體請(qǐng)點(diǎn)擊這里查看
4.優(yōu)點(diǎn): 1.給用戶提供了一種可以恢復(fù)狀態(tài)的機(jī)制面哥,可以使用戶能夠比較方便地回到某個(gè)歷史的狀態(tài)。 2.實(shí)現(xiàn)了信息的封裝毅待,使得用戶不需要關(guān)心狀態(tài)的保存細(xì)節(jié)尚卫。
5.缺點(diǎn): 在一些場景下比較消耗資源。
6.注意事項(xiàng): 不要在頻繁建立備份的場景中使用備忘錄模式恩静,比如說在for循環(huán)中焕毫。


策略模式(Strategy):

1.定義: 定義一系列的算法蹲坷,把它們一個(gè)個(gè)封裝起來驶乾,并且使它們可相互替換。
2. 使用場景: 1.多個(gè)類只有在算法或行為上稍有不同的場景循签。2.算法需要自由切換的場景级乐。3.需要屏蔽算法規(guī)則的場景。
3. 具體實(shí)現(xiàn): 具體請(qǐng)點(diǎn)擊這里查看
4.優(yōu)點(diǎn): 1.算法可以自由切換县匠。 2.避免使用多重條件判斷风科。 3.擴(kuò)展性良好。
5.缺點(diǎn):1.策略類會(huì)增多乞旦。 2.所有策略類都需要對(duì)外暴露贼穆。
6.注意事項(xiàng): 如果一個(gè)系統(tǒng)的策略多于四個(gè),就需要考慮使用混合模式兰粉,解決策略類膨脹的問題故痊。


訪問者模式(Visitor):

1.定義: 訪問者模式封裝了一些作用于某種數(shù)據(jù)結(jié)構(gòu)中的各元素操作,它可以在不改變數(shù)據(jù)結(jié)構(gòu)的前提下定義作用于這些元素的新的操作玖姑。
2. 使用場景: 需要對(duì)一個(gè)對(duì)象結(jié)構(gòu)中的對(duì)象進(jìn)行很多不同的并且不相關(guān)的操作愕秫,而需要避免讓這些操作"污染"這些對(duì)象的類,使用訪問者模式將這些封裝到類中焰络。
3. 具體實(shí)現(xiàn): 這里舉了一個(gè)悲觀的人和樂觀的人對(duì)待不同事物的反應(yīng)的實(shí)例戴甩,具體請(qǐng)點(diǎn)擊這里查看,如果想增加Action就比較方便闪彼,但是如果想增加一個(gè)既悲觀又樂觀的人就有一點(diǎn)麻煩了甜孤。
4.優(yōu)點(diǎn): 1.符合單一職責(zé)原則。 2.優(yōu)秀的擴(kuò)展性畏腕。 3.靈活性高
5.缺點(diǎn):1.具體元素對(duì)訪問者公布細(xì)節(jié)课蔬,違反了迪米特原則。 2.具體元素變更比較困難郊尝。 3.違反了依賴倒置原則二跋,依賴了具體類,沒有依賴抽象流昏。


模板方法模式(TemplateMethod):

1.定義: 定義一個(gè)操作中的算法的框架扎即,而降一些步驟延遲到子類中吞获。使得子類可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。
2. 使用場景: 1.多個(gè)子類有公有的方法谚鄙,并且邏輯基本相同時(shí)各拷。2.有重要、復(fù)雜的算法的時(shí)候闷营,可以把核心算法設(shè)計(jì)為模板方法烤黍,周邊的相關(guān)細(xì)節(jié)功能則由各個(gè)子類實(shí)現(xiàn)。
3. 具體實(shí)現(xiàn): 這里簡單舉了一個(gè)Android 和iOS項(xiàng)目的從code到發(fā)布的簡易過程Demo傻盟,具體請(qǐng)點(diǎn)擊這里查看
4.優(yōu)點(diǎn): 1.封裝不變部分速蕊,擴(kuò)展可變部分。 2.提取公共代碼娘赴,便于維護(hù)规哲。 3.行為由父類控制,子類實(shí)現(xiàn)诽表。
5.缺點(diǎn): 每一個(gè)不同的實(shí)現(xiàn)都需要一個(gè)子類來實(shí)現(xiàn)唉锌,導(dǎo)致類的個(gè)數(shù)增加,使得系統(tǒng)更加龐大竿奏。


狀態(tài)模式(State):

1.定義: 當(dāng)一個(gè)對(duì)象內(nèi)在狀態(tài)改變時(shí)允許其改變行為袄简,這個(gè)對(duì)象看起來像改變了其類。
2. 使用場景: 1.行為隨狀態(tài)改變而改變的場景泛啸。2.條件绿语、分支判斷語句的替代者。
3. 具體實(shí)現(xiàn): 這里舉了一個(gè)不太恰當(dāng)?shù)睦悠教担偃缫恢ЧP有3種狀態(tài)可以切換汞舱,可以寫鋼筆字,圓珠筆字宗雇,毛筆字昂芜,具體請(qǐng)點(diǎn)擊這里查看。再舉一個(gè)實(shí)際中典型的例子就是酒店管理房間的時(shí)候赔蒲,房間應(yīng)該會(huì)有三種狀態(tài):空閑泌神,已預(yù)訂,已入住舞虱,同理欢际。
4.優(yōu)點(diǎn): 1.結(jié)構(gòu)清晰,避免了過多的選擇判斷語句矾兜。2.封裝性比較好损趋。
5.缺點(diǎn): 子類會(huì)比較多,增加了復(fù)雜度椅寺。


迭代器模式(Iterator):

1.定義: 迭代器模式提供一種方法訪問一個(gè)容器對(duì)象中各個(gè)元素浑槽,而又不需暴露該對(duì)象的內(nèi)部細(xì)節(jié)蒋失。
2. 使用場景: 一個(gè)聚合對(duì)象有遍歷的需求
3. 具體實(shí)現(xiàn): 在 Cocoa Touch 中的 NSEnumerator類 就實(shí)現(xiàn)了迭代器模式。還有基于塊的枚舉也是迭代器模式的實(shí)現(xiàn)等等
4.優(yōu)點(diǎn): 1.它支持以不同的方式遍歷一個(gè)聚合對(duì)象桐玻。2.增加新的collection類和迭代器類都很方便篙挽。
5.缺點(diǎn): 迭代器和collection類是對(duì)應(yīng)的,增加新的collection類就會(huì)增加新的迭代器镊靴,類的個(gè)數(shù)成對(duì)增加铣卡,可能會(huì)增加系統(tǒng)復(fù)雜度。


解釋器模式(Interpreter):

1.定義: 給定一門語言偏竟,定義它的文法的一種表示煮落,并定義一個(gè)解釋器,該解釋器使用該表示來解釋語言中的句子苫耸。
2. 使用場景: 解釋器模式在實(shí)際項(xiàng)目中用到的比較少州邢,正則表達(dá)式就是用的解釋器模式儡陨。
3. 具體實(shí)現(xiàn): 正則表達(dá)式褪子。
4.優(yōu)點(diǎn): 容易改變和擴(kuò)展問法。
5.缺點(diǎn): 效率是嚴(yán)重的問題骗村。


擴(kuò)展閱讀:
iOS 中的 21 種設(shè)計(jì)模式
https://github.com/kamranahmedse/design-patterns-for-humans


EOF:這篇文章通過Demo梳理了設(shè)計(jì)模式中的行為型模式嫌褪,由于個(gè)人能力有限,難免有一些遺漏或者錯(cuò)誤胚股,還請(qǐng)各位看官不吝賜教笼痛! 本文已同步到個(gè)人博客歡迎關(guān)注琅拌,歡迎點(diǎn)贊缨伊,歡迎star,歡迎一起交流进宝,一起進(jìn)步刻坊!??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市党晋,隨后出現(xiàn)的幾起案子谭胚,更是在濱河造成了極大的恐慌,老刑警劉巖未玻,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件灾而,死亡現(xiàn)場離奇詭異,居然都是意外死亡扳剿,警方通過查閱死者的電腦和手機(jī)旁趟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來庇绽,“玉大人锡搜,你說我怎么就攤上這事癣猾。” “怎么了余爆?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵纷宇,是天一觀的道長。 經(jīng)常有香客問我蛾方,道長像捶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任桩砰,我火速辦了婚禮拓春,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘亚隅。我一直安慰自己硼莽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布煮纵。 她就那樣靜靜地躺著懂鸵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪行疏。 梳的紋絲不亂的頭發(fā)上匆光,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音酿联,去河邊找鬼终息。 笑死,一個(gè)胖子當(dāng)著我的面吹牛贞让,可吹牛的內(nèi)容都是我干的周崭。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼喳张,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼续镇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蹲姐,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤磨取,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后柴墩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體忙厌,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年江咳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了逢净。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖爹土,靈堂內(nèi)的尸體忽然破棺而出甥雕,到底是詐尸還是另有隱情,我是刑警寧澤胀茵,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布社露,位于F島的核電站,受9級(jí)特大地震影響琼娘,放射性物質(zhì)發(fā)生泄漏峭弟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一脱拼、第九天 我趴在偏房一處隱蔽的房頂上張望瞒瘸。 院中可真熱鬧,春花似錦熄浓、人聲如沸情臭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽俯在。三九已至,卻和暖如春惯雳,著一層夾襖步出監(jiān)牢的瞬間朝巫,已是汗流浹背鸿摇。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國打工石景, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拙吉。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親勺良。 傳聞我的和親對(duì)象是個(gè)殘疾皇子刊头,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容