清單
模式 | 概要 | 什么時候選用 | 注意 | 實操 |
---|---|---|---|---|
觀察者 | 在對象之間定義一個一對多的依賴關(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ā)送者孤页,也可以同時是消息的接收者尔苦。
- 觀察者模式