一:責(zé)任鏈模式
含義:為請求創(chuàng)建了一個接收者對象的鏈凰萨。這種模式給予請求的類型季率,對請求的發(fā)送者和接收者進行解耦;具體的來說就是每個接收者都包含對另一個接收者的引用萄金。如果一個對象不能處理該請求攀唯,那么它會把相同的請求傳給下一個接收者洁桌,依此類推;
意圖:避免請求發(fā)送者與接收者耦合在一起,讓多個對象都有可能接收請求,將這些對象連接成一條鏈实夹,并且沿著這條鏈傳遞請求,直到有對象處理它為止吠谢。
主要解決:職責(zé)鏈上的處理者負責(zé)處理請求,客戶只需要將請求發(fā)送到職責(zé)鏈上即可诗茎,無須關(guān)心請求的處理細節(jié)和請求的傳遞囊卜,所以職責(zé)鏈將請求的發(fā)送者和請求的處理者解耦了。
優(yōu)點:?1错沃、降低耦合度栅组。它將請求的發(fā)送者和接收者解耦。 2枢析、簡化了對象玉掸。使得對象不需要知道鏈的結(jié)構(gòu)。 3醒叁、增強給對象指派職責(zé)的靈活性司浪。通過改變鏈內(nèi)的成員或者調(diào)動它們的次序,允許動態(tài)地新增或者刪除責(zé)任把沼。 4啊易、增加新的請求處理類很方便。
缺點:?1饮睬、不能保證請求一定被接收租谈。 2、系統(tǒng)性能將受到一定影響捆愁,而且在進行代碼調(diào)試時不太方便割去,可能會造成循環(huán)調(diào)用。 3昼丑、可能不容易觀察運行時的特征呻逆,有礙于除錯。
例子:runtime消息執(zhí)行機制菩帝。先尋找當(dāng)前類方法咖城,如果沒有再找父類依次類推;
二:命令模式
含義:請求以命令的形式包裹在對象中呼奢,并傳給調(diào)用對象宜雀。調(diào)用對象尋找可以處理該命令的合適的對象,并把該命令傳給相應(yīng)的對象控妻,該對象執(zhí)行命令州袒;
用例:GUI中的每個按鈕都是一條命令,步驟為?調(diào)用者(button)→接受者(self)→命令(執(zhí)行)弓候;
使用場景:在某些場合郎哭,比如要對行為進行"記錄、撤銷/重做菇存、事務(wù)"等處理夸研,這種無法抵御變化的緊耦合是不合適的。在這種情況下依鸥,如何將"行為請求者"與"行為實現(xiàn)者"解耦亥至?將一組行為抽象為對象,可以實現(xiàn)二者之間的松耦合。
個人理解:就是將代碼分開姐扮,松耦合絮供;命令可以通過不同參數(shù)執(zhí)行一套代碼,而不用一個命令一個方法茶敏;
三:解釋器模式
含義:提供了評估語言的語法或表達式的方式壤靶,這種模式實現(xiàn)了一個表達式接口,該接口解釋一個特定的上下文惊搏。這種模式被用在 SQL 解析贮乳、符號處理引擎等。
備注:OC中目前個人還沒遇到過或者說遺漏了恬惯;
四:迭代器模式
含義:用于順序訪問集合對象的元素向拆,不需要知道集合對象的底層表示。
使用場景:1酪耳、訪問一個聚合對象的內(nèi)容而無須暴露它的內(nèi)部表示浓恳。 2、需要為聚合對象提供多種遍歷方式葡兑。 3奖蔓、為遍歷不同的聚合結(jié)構(gòu)提供一個統(tǒng)一的接口。
如何解決:把在元素之間游走的責(zé)任交給迭代器讹堤,而不是聚合對象吆鹤。
優(yōu)點:?1、它支持以不同的方式遍歷一個聚合對象洲守。 2疑务、迭代器簡化了聚合類。 3梗醇、在同一個聚合上可以有多個遍歷知允。 4、在迭代器模式中叙谨,增加新的聚合類和迭代器類都很方便温鸽,無須修改原有代碼。
缺點:由于迭代器模式將存儲數(shù)據(jù)和遍歷數(shù)據(jù)的職責(zé)分離手负,增加新的聚合類需要對應(yīng)增加新的迭代器類涤垫,類的個數(shù)成對增加,這在一定程度上增加了系統(tǒng)的復(fù)雜性竟终。
用例:FMDB的 [result net],字典和組織的遍歷NSEnumerator *enumerator =[dic/arr objectEnumerator]->[enumerator nextObject]
五:中介者模式
含義:是用來降低多個對象和類之間的通信復(fù)雜性蝠猬。這種模式提供了一個中介類,該類通常處理不同類之間的通信统捶,并支持松耦合榆芦,使代碼易于維護柄粹;
使用場景:對象與對象之間存在大量的關(guān)聯(lián)關(guān)系,這樣勢必會導(dǎo)致系統(tǒng)的結(jié)構(gòu)變得很復(fù)雜匆绣,同時若一個對象發(fā)生改變驻右,我們也需要跟蹤與之相關(guān)聯(lián)的對象,同時做出相應(yīng)的處理犬绒。
用例:MVC 框架旺入,其中C(控制器)就是 Model(模型)和 View(視圖)的中介者
總結(jié):
(1).這里讓我想到了橋接模式,從模式來說:橋接模式是結(jié)構(gòu)凯力,中介者是行為,那么可以這樣說結(jié)構(gòu)定義好了礼华,是不可變的咐鹤,行為是可變的。橋建好了圣絮,至于兩端大陸怎么變是不管的祈惶,而中介者有自己的行為,他可以決定讓不讓兩端建立連接扮匠,以怎樣的方式建立連接捧请;
(2).MVVM用的是橋接模式,C控制器是綁定View 與 ViewModel的橋梁棒搜,不負責(zé)他們之間的交互疹蛉;而MVC用的是中介者模式,是控制Model與View的交付力麸;
六:備忘錄模式
含義:保存一個對象的某個狀態(tài)可款,以便在適當(dāng)?shù)臅r候恢復(fù)對象。
使用場景:顧名思義就不再過多闡述克蚂;
用例:游戲存檔闺鲸;
優(yōu)點:?1、給用戶提供了一種可以恢復(fù)狀態(tài)的機制埃叭,可以使用戶能夠比較方便地回到某個歷史的狀態(tài)摸恍。 2、實現(xiàn)了信息的封裝赤屋,使得用戶不需要關(guān)心狀態(tài)的保存細節(jié)立镶。
缺點:消耗資源。如果類的成員變量過多益缎,勢必會占用比較大的資源谜慌,而且每一次保存都會消耗一定的內(nèi)存。
七:觀察者模式
含義:當(dāng)一個對象被修改時莺奔,則會自動通知它的依賴對象欣范;
使用場景:定義對象間的一種一對多的依賴關(guān)系变泄,當(dāng)一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并被自動更新恼琼。
優(yōu)點:?1妨蛹、觀察者和被觀察者是抽象耦合的。 2晴竞、建立一套觸發(fā)機制蛙卤。實時性更強;
使用注意:避免造成循環(huán)引用噩死,合適的時機移除觀察者颤难;
八:狀態(tài)模式
含義:類的行為是基于它的狀態(tài)改變的;
使用場景:?1已维、行為隨狀態(tài)改變而改變的場景行嗤。 2、條件垛耳、分支語句的代替者栅屏。
用例:自定義了一個View,當(dāng)文件未下載是顯示待下載堂鲜,在上傳時自動轉(zhuǎn)圈栈雳,在下載完成后顯示已完成;
九:空對象模式
待補充
十:策略模式
含義:一個類定義好一個策略后缔莲,它的行為或其算法可以在運行時自動更改哥纫;
使用場景:?1、如果在一個系統(tǒng)里面有許多類酌予,它們之間的區(qū)別僅在于它們的行為磺箕,那么使用策略模式可以動態(tài)地讓一個對象在許多行為中選擇一種行為。 2抛虫、一個系統(tǒng)需要動態(tài)地在幾種算法中選擇一種松靡。 3、如果一個對象有很多的行為建椰,如果不用恰當(dāng)?shù)哪J降衿郏@些行為就只好使用多重的條件選擇語句來實現(xiàn)。
主要解決:在有多種算法相似的情況下棉姐,使用 if...else 所帶來的復(fù)雜和難以維護屠列。
用例:一個類暴露了兩個參數(shù),而它的策略有加伞矩、減笛洛、乘;當(dāng)策略定義好以后乃坤,傳入兩個參數(shù)自動計算其結(jié)果苛让;
十一:模板模式
含義:個抽象類公開定義了執(zhí)行它的方法的方式/模板沟蔑。它的子類可以按需要重寫方法實現(xiàn),但調(diào)用將以抽象類中定義的方式進行狱杰;
使用場景:?1瘦材、有多個子類共有的方法,且邏輯相同仿畸。 2食棕、重要的、復(fù)雜的方法错沽,可以考慮作為模板方法簿晓。
用例:網(wǎng)絡(luò)請求類每次請求接口都需要上傳系統(tǒng)時間、用戶id等甥捺,此時就可以將它封裝起來抢蚀;
優(yōu)點:?1、封裝不變部分镰禾,擴展可變部分。 2唱逢、提取公共代碼吴侦,便于維護。 3坞古、行為由父類控制备韧,子類實現(xiàn)。
缺點:每一個不同的實現(xiàn)都需要一個子類來實現(xiàn)痪枫,導(dǎo)致類的個數(shù)增加织堂,使得系統(tǒng)更加龐大。
十二:訪問者模式
含義:我們使用了一個訪問者類奶陈,它改變了元素類的執(zhí)行算法易阳。通過這種方式,元素的執(zhí)行算法可以隨著訪問者改變而改變吃粒。根據(jù)模式潦俺,元素對象已接受訪問者對象,這樣訪問者對象就可以處理元素對象上的操作徐勃。
使用場景:訪問一個對象事示,根據(jù)對象的不對反饋信息,做出不同的選擇僻肖;
用例:去朋友家訪問朋友肖爵,朋友告訴你有籃球、羽毛球臀脏、乒乓球等劝堪,你得到這些信息以后冀自,做出選擇玩什么的判斷;
優(yōu)點:?1幅聘、符合單一職責(zé)原則凡纳。 2、優(yōu)秀的擴展性帝蒿。 3荐糜、靈活性。
缺點:?1葛超、具體元素對訪問者公布細節(jié)暴氏,違反了迪米特原則。 2绣张、具體元素變更比較困難答渔。 3、違反了依賴倒置原則侥涵,依賴了具體類沼撕,沒有依賴抽象。