《設計模式之美》筆記:設計模式-行為型

清單

模式 概要 什么時候選用 注意 實操
觀察者 在對象之間定義一個一對多的依賴關(guān)系纲菌,當一個對象狀態(tài)改變的時候仑性,所有依賴的對象都會自動收到通知 · 觀察者變動較頻繁
· 希望借助異步來提高吞吐量
· 同步阻塞
· 異步非阻塞
· 進程內(nèi)
· 進程間
· 線程池
· 消息隊列
模板 在一個方法中定義一個算法骨架怠褐,并將某些步驟推遲到子類中實現(xiàn)嘲玫,這里的“算法”可以理解為廣義上的“業(yè)務邏輯” · 復用
· 擴展
- · 繼承
· 抽象
策略 定義一簇算法類雏门,將每個算法分別封裝起來鼎姐,讓它們可以互相替換 · 概念上屬于同類的不同對象,可對外暴露同樣的接口船殉,而各自有不同的實現(xiàn)
· 添加新“策略”時可以最小化鲫趁、集中化代碼改動
- · 不同策略實現(xiàn)相同的接口或繼承相同的父類
· 工廠類運行時確定選用的“策略”
· 查表法或if-else分支判斷
職責鏈 將請求的發(fā)送和接收解耦,讓多個接收對象都有機會處理這個請求利虫。將這些接收對象串成一條鏈挨厚,并沿著這條鏈傳遞這個請求堡僻,直到鏈上的某個接收對象能夠過處理它為止 · 過濾器
· 攔截器
- · 處理器Filter
· 處理器鏈FilterChain
狀態(tài) 狀態(tài)機的一種實現(xiàn)方式 狀態(tài)種類不太多,而事件觸發(fā)的動作比較復雜 - · 每種狀態(tài)封裝成一個類疫剃,將事件和動作包在其中
迭代器 用來遍歷集合對象 - 遍歷的同時增刪集合元素钉疫,會發(fā)生未決行為 · 容器,定義iterator()方法
· 迭代器巢价,定義三個方法:hasNext(), currentItem(), next()
訪問者 允許一個或者多個操作應用到一組對象上牲阁,解耦操作和對象本身 很少用,不好理解 - 將操作獨立出來一個類蹄溉,對一組不同的對象進行操作
備忘錄 在不違背封裝原則的前提下咨油,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài)柒爵,以便之后恢復對象為先前的狀態(tài) 用來防丟役电、撤銷、恢復等 - 對于大對象的備份棉胀,可以低頻全量備份法瑟,高頻增量備份
命令模式 將請求(命令)封裝為一個對象,這個對象支持被傳遞唁奢,從而能夠?qū)⒄埱螅睿┳雠抨狏惒綀?zhí)行等操作 用來控制命令的執(zhí)行,比如異步麻掸、延遲酥夭、排隊、撤銷重做等 - 很少用
解釋器 為某個語言定義它的語法(或者叫文法)表示脊奋,并定義一個解釋器用來處理這個語法 如:翻譯器熬北,計算器,自定義接口告警規(guī)則等 - 一般做法是诚隙,將語法規(guī)則拆分成一些小的獨立單元讶隐,然后對每個單元進行解析,最終合并為整個語法規(guī)則的解析
中介 定義了一個單獨的(中介)對象久又,來封裝一組對象之間的交互巫延。將這組對象之間的交互委派給與中介對象交互,來避免對象之間的直接交互 只有當參與者之間的交互關(guān)系錯綜復雜地消,維護成本很高的時候炉峰,我們才考慮使用中介模式 好處是簡化了一組對象之間的交互,壞處是中介類可能會編程大而復雜的“上帝類” 引入中介這個中間層脉执,將一組對象之間的交互關(guān)系(或者依賴關(guān)系)從多對多(網(wǎng)狀關(guān)系)轉(zhuǎn)換成一對多(星狀關(guān)系)
- - - - -




設計模式要干的事情就是解耦

  • 創(chuàng)建型模式是將創(chuàng)建和使用代碼解耦
  • 結(jié)構(gòu)型模式是將不同的功能代碼解耦
  • 行為型模式是將不同的行為代碼解耦
    • 觀察者模型疼阔,是將觀察者和被觀察者代碼解耦


模板模式

  • 復用
    • 所有子類可以復用父類中提供的模板方法的代碼
  • 擴展
    • 框架通過模板模式提供功能擴展點,讓框架用戶可以在不修改框架源碼的情況下适瓦,基于擴展點定制化框架的功能


回調(diào)

- 簡介
    - 回調(diào)是一種雙向調(diào)用關(guān)系竿开。A類事先注冊某個函數(shù)F到B類,A類在調(diào)用B類中的P函數(shù)的時候玻熙,B類反過來調(diào)用A類注冊給它的F函數(shù)否彩。這里的F函數(shù)就是“回調(diào)函數(shù)”。A調(diào)用B嗦随,B反過來又調(diào)用A列荔,這種調(diào)用機制就叫做“回調(diào)”。
- 同步回調(diào)
    - 函數(shù)返回之前執(zhí)行回調(diào)函數(shù)
    - 像模板模式
        - 從代碼實現(xiàn)上來看枚尼,回調(diào)和模板模式完全不同贴浙。回調(diào)基于組合關(guān)系來實現(xiàn)署恍,把一個對象傳遞給另一個對象崎溃,是一種對象之間的關(guān)系;模板模式基于繼承關(guān)系來實現(xiàn)盯质,子類重寫父類的抽象方法袁串,是一種類之間的關(guān)系。
- 異步回調(diào)
    - 函數(shù)返回之后執(zhí)行回調(diào)函數(shù)
    - 像觀察者模式


策略模式

  • 解耦的是策略的定義呼巷、創(chuàng)建囱修、使用三個部分


狀態(tài)機

  • 三種實現(xiàn)方式
    • 分支邏輯法
      • 利用if-else或者switch-case;對簡單狀態(tài)機來說王悍,這個方式最簡單直接破镰。
    • 查表法
      • 對于狀態(tài)非常多,狀態(tài)轉(zhuǎn)移比較復雜的狀態(tài)機压储,這個方式比較合適鲜漩;通過二維數(shù)組來表示狀態(tài)轉(zhuǎn)移圖,能極大提高代碼的可讀性和可維護性渠脉。
    • 狀態(tài)模式
      • 對于狀態(tài)不多宇整,狀態(tài)轉(zhuǎn)移也比較簡單,但事件觸發(fā)執(zhí)行的動作包含的業(yè)務邏輯可能比較復雜的狀態(tài)機來說芋膘,這個方式是首選鳞青。


迭代器模式

  • 遍歷集合一般有三種方式:for循環(huán)、foreach循環(huán)为朋、迭代器遍歷臂拓;后兩種都可以看做迭代器遍歷;
  • 迭代器相對for循環(huán)的三個優(yōu)勢
    • 迭代器模式封裝集合內(nèi)部的復雜數(shù)據(jù)結(jié)構(gòu)习寸,開發(fā)者不用了解如何遍歷胶惰,直接使用容器提供的迭代器即可
    • 迭代器模式將集合對象的遍歷操作從集合類中拆分出來,放到迭代器類中霞溪,讓兩者的職責更加單一
    • 迭代器模式讓添加新的遍歷算法更加容易孵滞,更符合開閉原則中捆;另外,因為迭代器都實現(xiàn)自相同的接口坊饶,在開發(fā)中泄伪,基于接口而非實現(xiàn)編程,替換迭代器也更加容易


中介模式 vs 觀察者模式

  • 區(qū)別
    • 觀察者模式
      • 參與者之間的交互比較有條理匿级,一般都是單向的蟋滴,一個參與者只有一個身份,要么是觀察者痘绎,要么是被觀察者津函。
    • 中介模式
      • 參與者之間的交互關(guān)系錯綜復雜,既可以是消息的發(fā)送者孤页,也可以同時是消息的接收者尔苦。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市散庶,隨后出現(xiàn)的幾起案子蕉堰,更是在濱河造成了極大的恐慌,老刑警劉巖悲龟,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屋讶,死亡現(xiàn)場離奇詭異,居然都是意外死亡须教,警方通過查閱死者的電腦和手機皿渗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來轻腺,“玉大人乐疆,你說我怎么就攤上這事”嵫” “怎么了挤土?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵,是天一觀的道長误算。 經(jīng)常有香客問我仰美,道長,這世上最難降的妖魔是什么儿礼? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任咖杂,我火速辦了婚禮,結(jié)果婚禮上蚊夫,老公的妹妹穿的比我還像新娘诉字。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布壤圃。 她就那樣靜靜地躺著陵霉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪伍绳。 梳的紋絲不亂的頭發(fā)上撩匕,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天,我揣著相機與錄音墨叛,去河邊找鬼。 笑死模蜡,一個胖子當著我的面吹牛漠趁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播忍疾,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼闯传,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了卤妒?” 一聲冷哼從身側(cè)響起甥绿,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎则披,沒想到半個月后共缕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡士复,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年图谷,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阱洪。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡便贵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出冗荸,到底是詐尸還是另有隱情承璃,我是刑警寧澤,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布蚌本,位于F島的核電站盔粹,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏魂毁。R本人自食惡果不足惜玻佩,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望席楚。 院中可真熱鬧咬崔,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至兜蠕,卻和暖如春扰肌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背熊杨。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工曙旭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人晶府。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓桂躏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親川陆。 傳聞我的和親對象是個殘疾皇子剂习,可洞房花燭夜當晚...
    茶點故事閱讀 45,922評論 2 361

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