行為型設計模式
行為型設計模式涉及到算法和對象間職責的分配郭怪。不僅描述對象或類的模式,還描述它們之間的通信模式嘉赎。
行為型設計模式有以下11種:
- 責任鏈(Chain of Responsibility)
- 命令(Commad)
- 解釋器(Interpreter)
- 迭代器(Iterator)
- 中介者(Mediator)
- 備忘錄(Memento)
- 觀察者(Observer)
- 狀態(tài)(State)
- 策略(Strategy)
- 模板方法(Template Method)
- 訪問者(Visitor)
責任鏈(Chain of Responsibility)
- 意圖:使多個對象都有機會處理請求膝晾,從而避免請求的發(fā)送者和接受者之間的耦合關系。將這些對象連成一條鏈胸完,并沿著這條鏈傳遞該請求书释,直到有一個對象處理它為止。通俗理解就是赊窥,有多個不同優(yōu)先級的對象可以處理請求爆惧,使用鏈表的形式可以方便增加刪除對象,自動調整優(yōu)先級锨能。側重點在于動態(tài)調整扯再,模塊解耦芍耘。
- 例子:窗口各個控件響應一次鍵盤輸入請求。
- 優(yōu)點:降低耦合熄阻、增加動態(tài)分配的靈活性斋竞。
- 缺點:請求可能會沒有對象處理。
設計模式-責任鏈.jpg
命令(Commad)
- 意圖:將一個請求封裝為一個對象饺律,從而使你可用不同的請求對客戶進行參數(shù)化窃页;對請求排隊或記錄請求日志,以及支持可撤銷操作复濒。通俗理解就是脖卖,實現(xiàn)回調函數(shù)的面向對象版本,其中用對象代替回調函數(shù)巧颈,多個回調函數(shù)則用多個子類實現(xiàn)畦木。側重點在于回調機制,模塊解耦砸泛。
- 例子:剪切板的實現(xiàn)十籍,同樣的內容粘貼到不同的位置有不同的效果。
- 優(yōu)點:請求與響應解耦唇礁、易于控制和擴展勾栗。
- 缺點:要仔細考慮請求者與響應者之間的職責分配。
設計模式-命令.jpg
解釋器(Interpreter)
- 意圖:給定一個語言盏筐,定義它的文法的一種表示围俘,并定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子琢融。通俗理解就是界牡,將高頻發(fā)生的特定類型問題轉換成一種語言,并實現(xiàn)一個樹型的文法解釋器漾抬。側重點在于問題轉化成語言宿亡。
- 例子:正則表達式解決字符串匹配問題。
- 優(yōu)點:易于改變纳令、擴展和實現(xiàn)文法挽荠。
- 缺點:復雜文法無法管理、效率低平绩。
設計模式-解釋器.jpg
迭代器(Iterator)
- 意圖:提供一種方法順序訪問一個聚合對象中的各個元素坤按,而又不需暴露該對象的內部表示。通俗理解就是馒过,將元素的遍歷操作單獨封裝到一個對象中臭脓,實現(xiàn)功能解耦。側重點在于功能解耦腹忽。
- 例子:C++迭代器来累。
- 優(yōu)點:支持多種方式遍歷砚作、支持并行遍歷、簡化接口嘹锁。
- 缺點:需要充分考慮增刪時迭代的健壯性葫录。
設計模式-迭代器.jpg
中介者(Mediator)
- 意圖:用一個中介對象來封裝一系列對象的交互。中介者使各個對象不需要顯式地相互引用领猾,從而使其耦合松散米同,而且可以獨立地改變它們之間的交互。通俗理解就是摔竿,將分布式結構轉換成星形結構面粮。側重點在于對象間訪問解耦。
- 例子:增加一個管理者類使窗口的各個控件類解耦继低。
- 優(yōu)點:減少子類生成熬苍、簡化對象協(xié)議、對象間訪問解耦袁翁。
- 缺點:中介者的復雜性大柴底,可能難以維護。
設計模式-中介者.jpg
備忘錄(Memento)
- 意圖:在不破壞封裝性的前提下粱胜,捕獲一個對象的內部狀態(tài)柄驻。并在該對象之外保存這個狀態(tài)。這樣以后就可將該對象恢復到原先保存的狀態(tài)焙压。通俗理解就是鸿脓,將對象狀態(tài)在外部保存下來實現(xiàn)完全恢復。側重點在于備份還原冗恨。
- 例子:實現(xiàn)撤銷功能答憔、系統(tǒng)還原味赃。
- 優(yōu)點:保持封裝不被破壞掀抹、簡化備份對象的實現(xiàn)躁染。
- 缺點:使用的代價可能很高店诗、開銷大搞旭。
設計模式-備忘錄.jpg
觀察者(Observer)
- 意圖:定義對象間一種一對多的依賴關系至耻,當一個對象的狀態(tài)發(fā)生改變時凳枝,所有依賴于它的對象都得到通知并被自動更新剧防。通俗理解就是旦装,增加中間轉發(fā)類將分布式結構變成星形結構笛坦,實現(xiàn)消息收發(fā)解耦狠持。側重點在于模塊解耦疟位。
- 例子:MQTT 發(fā)布-訂閱機制。
- 優(yōu)點:消息發(fā)送者和接受者解耦喘垂、支持廣播機制甜刻。
- 缺點:可能會出現(xiàn)意外的更新绍撞。
設計模式-觀察者.jpg
狀態(tài)(State)
- 意圖:允許一個對象在其內部狀態(tài)改變時改變它的行為。對象看起來似乎修改了它的類得院。通俗理解就是傻铣,將狀態(tài)機實現(xiàn)為多個子類,每個子類對應一種狀態(tài)祥绞。側重點在于子模塊拆分非洲。
- 例子:實現(xiàn)TCP連接。
- 優(yōu)點:容易增加新的狀態(tài)和轉換蜕径、使轉換顯式化两踏。
- 缺點:管理state對象較為復雜。
設計模式-狀態(tài).jpg
策略(Strategy)
- 意圖:定義一系列的算法丧荐,把它們一個一個封裝起來缆瓣,并且使它們可以相互替換。使得算法可獨立于使用它的客戶而變化虹统。通俗理解就是弓坞,將多個switch分支對應一個子類,方便替換车荔。側重點在于子模塊拆分渡冻。
- 例子:提供多種內存管理算法,用戶根據(jù)實際需要配置忧便。
- 優(yōu)點:消除一些條件語句族吻、方便客戶選擇和裁剪。
- 缺點:增加了對象和通信開銷珠增。
設計模式-策略.jpg
模板方法(Template Method)
- 意圖:定義一個操作中的算法的骨架將一些步驟延遲到子類中超歌。使子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。通俗理解就是蒂教,將可變部分定義為虛函數(shù)并只允許外部訪問不可變的成員函數(shù)巍举。側重點在于提取公共行為。
- 例子:幾乎可以在所有基類見到凝垛。
- 優(yōu)點:提供父類動態(tài)調用子類的方法懊悯。
- 缺點:可變部分過多會導致子類冗長。
設計模式-模板方法.jpg
訪問者(Visitor)
- 意圖:表示一個作用于某對象結構中的各元素的操作梦皮。使得可以在不改變各元素的的類的前提下定義作用于這些元素的新操作炭分。通俗理解就是,通過傳遞this指針剑肯,自定義新操作捧毛。側重點在于集中代碼。
- 例子:給每個類增加白盒測試用例,集中代碼到一個測試類呀忧,可以避免將測試代碼分散到各個類中型将。
- 優(yōu)點:易于增加新操作、按功能集中代碼荐虐。
- 缺點:可能會累積狀態(tài)七兜、常常會破壞封裝、增加新子類困難福扬。
設計模式-訪問者.jpg
行為型設計模式小結
- 待補充