設計模式學習(三):行為型

行為型設計模式

行為型設計模式涉及到算法和對象間職責的分配郭怪。不僅描述對象或類的模式,還描述它們之間的通信模式嘉赎。
行為型設計模式有以下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

行為型設計模式小結

  • 待補充
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末腕铸,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子铛碑,更是在濱河造成了極大的恐慌狠裹,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件汽烦,死亡現(xiàn)場離奇詭異涛菠,居然都是意外死亡,警方通過查閱死者的電腦和手機撇吞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門俗冻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人牍颈,你說我怎么就攤上這事迄薄。” “怎么了煮岁?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵讥蔽,是天一觀的道長。 經(jīng)常有香客問我画机,道長冶伞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任步氏,我火速辦了婚禮响禽,結果婚禮上,老公的妹妹穿的比我還像新娘戳护。我一直安慰自己金抡,他們只是感情好瀑焦,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布腌且。 她就那樣靜靜地躺著,像睡著了一般榛瓮。 火紅的嫁衣襯著肌膚如雪铺董。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天,我揣著相機與錄音精续,去河邊找鬼坝锰。 笑死,一個胖子當著我的面吹牛重付,可吹牛的內容都是我干的顷级。 我是一名探鬼主播,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼确垫,長吁一口氣:“原來是場噩夢啊……” “哼弓颈!你這毒婦竟也來了?” 一聲冷哼從身側響起删掀,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤翔冀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后披泪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纤子,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年款票,在試婚紗的時候發(fā)現(xiàn)自己被綠了控硼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡艾少,死狀恐怖象颖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情姆钉,我是刑警寧澤说订,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站潮瓶,受9級特大地震影響陶冷,放射性物質發(fā)生泄漏。R本人自食惡果不足惜毯辅,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一埂伦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧思恐,春花似錦沾谜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至描焰,卻和暖如春媳否,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工篱竭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留力图,地道東北人。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓掺逼,卻偏偏與公主長得像吃媒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子吕喘,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內容