本篇是四部曲的第三篇艳狐,第一篇請(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)擊這里
上圖是整個(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)步刻坊!??