設(shè)計模式之行為模式

一:責(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、違反了依賴倒置原則侥涵,依賴了具體類沼撕,沒有依賴抽象。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末芜飘,一起剝皮案震驚了整個濱河市务豺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嗦明,老刑警劉巖笼沥,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異娶牌,居然都是意外死亡奔浅,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門诗良,熙熙樓的掌柜王于貴愁眉苦臉地迎上來汹桦,“玉大人,你說我怎么就攤上這事累榜∮冢” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵壹罚,是天一觀的道長葛作。 經(jīng)常有香客問我,道長猖凛,這世上最難降的妖魔是什么赂蠢? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮辨泳,結(jié)果婚禮上虱岂,老公的妹妹穿的比我還像新娘玖院。我一直安慰自己,他們只是感情好第岖,可當(dāng)我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布难菌。 她就那樣靜靜地躺著,像睡著了一般蔑滓。 火紅的嫁衣襯著肌膚如雪郊酒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天键袱,我揣著相機與錄音燎窘,去河邊找鬼。 笑死蹄咖,一個胖子當(dāng)著我的面吹牛褐健,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播澜汤,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蚜迅,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了俊抵?” 一聲冷哼從身側(cè)響起慢叨,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎务蝠,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體烛缔,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡馏段,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了践瓷。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片院喜。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖晕翠,靈堂內(nèi)的尸體忽然破棺而出喷舀,到底是詐尸還是另有隱情,我是刑警寧澤淋肾,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布硫麻,位于F島的核電站,受9級特大地震影響樊卓,放射性物質(zhì)發(fā)生泄漏拿愧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一碌尔、第九天 我趴在偏房一處隱蔽的房頂上張望浇辜。 院中可真熱鬧券敌,春花似錦、人聲如沸柳洋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽熊镣。三九已至卑雁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間轧钓,已是汗流浹背序厉。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留毕箍,地道東北人弛房。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像而柑,于是被迫代替她去往敵國和親文捶。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,933評論 2 355

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