軟件開發設計模式之【11】個【行爲型】設計模式

代碼碼雲倉庫地址:https://gitee.com/dzxmy/design_pattern

常用的行爲型設計模式有:策略模式,責任鏈模式,模板方法模式,狀態模式

不常用的行爲型設計模式有:觀察者模式,備忘錄模式,迭代器模式,中介者模式,命令模式,訪問者模式,解釋器模式

一、模板方法模式

定義:定義了一個算法的骨架,並允許子類爲一個或者多個步驟提供實現

模板方法使得子類可以不改變算法結構的情況下,重新定義算法的某些步驟

類型:行爲型

適用場景:

  • 一次性實現一個算法的不變的部分,並將可變的行爲留給子類來實現
  • 各個子類中公共的行爲被提取出來並集中到一個公共父類中,從而避免代碼重複

優點: 提高複用性,提高擴展性,符合開閉原則

缺點:類數目的增加,增加了系統實現的複雜度,繼承關係自身缺點,如果父類添加新的抽象方法,所有子類都要改一遍

com.dzx.design.behavioral.templatemethod 包下代碼:模板方法模式

二、 迭代器模式

定義:提供一種方法,順序訪問一個集合對象中的各個元素,而又不暴露該對象的內部表示

類型:行爲型

適用場景:訪問一個集合對象的內容而無需暴露它的內部表示

爲遍歷不同的集合結構提供一個統一接口

優點:分離了集合對象的遍歷行爲

缺點:類的個數成對增加

com.dzx.design.behavioral.iterator 包下代碼: 迭代器模式

 三、策略模式

定義:定義了算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓算法的變化不會影響到使用算法的用戶。

通過策略模式可以消除掉大量的if....else.....

類型:行爲型

適用場景:

  • 系統有很多類,而他們的區別僅僅在於他們的行爲不同
  • 一個系統需要動態地在幾種算法中選擇一種

優點:開閉原則,避免使用多重條件轉移語句,提高算法的保密性和安全性

缺點:客戶端必須知道所有的策略類,並自行決定使用哪一個策略類,產生很多策略類

com.dzx.design.behavioral.strategy 包下代碼:策略模式 

四、解釋器模式 

定義:給定一個語言,定義它的文法的一種表示,並定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。

爲了解釋一種語言,而爲語言創建的解釋器。

類型:行爲型

適用場景:某個特定類型問題發生頻率足夠高。

優點:語法由很多類表示,容易改變及擴展此語言

缺點:當語法規則數目太多時,增加了系統的複雜度

com.dzx.design.behavioral.interpreter 包下代碼: 解釋器模式

jdk中的正則Pattern 就用到解釋器模式。 

spring 中的ExpressionParser 解釋器

五、觀察者模式

 定義:定義了對象之間的一對多依賴,讓多個觀察者對象同時監聽某一個主題對象,當主題對象發生變化時,它的所有依賴者觀察者都會收到通知並更新

類型:行爲型

適用場景:關注行爲場景,建立一套觸發機制

優點:觀察者和被觀察者之間建立了一個抽象的耦合,觀察者模式支持廣播通信

缺點:觀察者之間有過多的細節依賴,提高時間消耗及程序複雜度,使用要得當,要避免循環調用

/**
 * 觀察者模式
 * Course課程作爲被觀察者 需要繼承 Observable 類,在有學生提出問題的時候調用父類的
 *         setChanged();
 *         notifyObservers(question) 這兩個方法
 * Teacher老師作爲觀察者 需要實現 Observer 接口 重寫update方法,就可以在有問題被學生提出的
 * 時候,自動的收到該問題。
 *
 */
com.dzx.design.behavioral.observer 包下代碼: 觀察者模式

 

com.dzx.design.behavioral.observer.event 包下代碼:guava方式利用EventBus實現觀察者模式

 

六、備忘錄模式

定義:保存一個對象的某個狀態,以便在適當的時候恢復對象。”後悔藥“

類型:行爲型

適用場景:保存及恢復數據相關業務場景,後悔的時候,即想恢復到之前的狀態

優點:爲用戶提供一種可恢復的機制,存檔信息的封裝

缺點:資源佔用

com.dzx.design.behavioral.memento 包下代碼:備忘錄模式

 

七、命令模式

定義:將”請求“封裝成對象,以便使用不同的請求

命令模式解決了應用程序中對象的職責以及他們之間的通信方式

類型:行爲型

適用場景:請求調用者和請求接收者需要解耦,使得調用者和接收者不直接交互,需要抽象出等待執行的行爲

優點:降低耦合,容易擴展新命令或者一組命令

缺點:命令的無限擴展會增加類的數量,提高系統實現複雜度

com.dzx.design.behavioral.command 包下代碼: 命令模式

 八、中介模式

定義:定義一個封裝一組對象如何交互的對象

通過使對象明確地相互引用來促進鬆散耦合,並允許獨立地改變它們的交互

類型: 行爲型

適用場景:系統中對象之間存在複雜的引用關係,產生的相互依賴關係結構混亂且難以理解,交互的公共行爲,如果需要改變行爲則可以增加新的中介者類

優點:將一對多轉化成了一對一,降低程序的複雜度,類之間解耦

缺點:中介者過多,導致系統複雜

com.dzx.design.behavioral.mediator 包下代碼:中介者模式

 九、責任鏈模式

定義:爲請求創建一個接收此次請求對象的鏈

類型:行爲型

適用場景:一個請求的處理需要多個對象中的一個或幾個協作處理

優點:請求的發送者和接收者解耦,責任鏈可以動態的組合

缺點:責任鏈太長或者處理時間過長,影響性能,責任鏈有可能過多

com.dzx.design.behavioral.chainofresponsibility 包下代碼:責任鏈模式

例如我們常常用到的javax.servlet.filter包下的Filter 就是典型的責任鏈模式

十、訪問者模式

定義:封裝作用於某數據結構(如list/set/map等)中的各元素的操作  ,可以在不改變各元素的類的前提下,定義作用於這些元素的操作

類型:行爲型

適用場景:一個數據結構如list/set/map等包含很多類型對象,數據結構與數據操作分離

優點:增加新的操作很容易,即增加一個新的訪問者

缺點: 增加新的數據結構困難,具體元素的變更比較麻煩

com.dzx.design.behavioral.visitor 包下代碼: 訪問者模式

 在 java.nio.file 包下 有個  FileVisitor 就是 使用的 訪問者模式

 十一、狀態模式

定義:允許一個對象在其內部狀態改變時,改變它的行爲 ,

類型:行爲型

適用場景: 一個對象存在多個狀態(不同狀態下行爲不同,且狀態可相互轉換)

優點: 將不同的狀態隔離,把各種狀態的轉換邏輯,分佈到state的子類中,減少相互間的依賴,增加新的狀態非常簡單

缺點:狀態多的業務場景導致類數目增加,系統變複雜

com.dzx.design.behavioral.state 包下代碼:狀態模式

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章