天天看點

設計模式舉例-行為型

行為類型設計模式

行為設計模式都是解決事件指令傳播和狀态方面的模式,如狀态模式處理單據因為類型和狀态而導緻的GUI顯示多樣性,指令模式解決菜單指令的分發。

觀察者模式(Observer):是一種廣泛使用的模式,很多GUI事件的分發都使用了這個模式,如Swing當中滑鼠事件的分發使用了MouseListener,定義了監聽接口函數和事件,還有監聽的注冊和登出機制。其它的GUI處理架構,如安卓,IOS也有類似的實作,JS架構也有相關的處理機制。擴充卡起模式常常和觀察者模式一起使用,如Swing的MouseAdaptor。

Command(指令模式):用來處理指令的分發,如果不使用這個模式,指令分發可能會變成大段大段的if-else-if-else-if,使用這個設計模式讓軟體結構清晰,擴充性非常好,下面舉一個應用的例子,Swing的工具欄事件處理。

設計模式舉例-行為型

對應的Command模式代碼實作

設計模式舉例-行為型

如果沒有設計模式,代碼會變成如下:

設計模式舉例-行為型

使用Command設計模式另外一個好處就是可以集中化處理一些事務,如日志,異常錯誤的處理等等,而且通用的業務邏輯也可以放到這裡。

Visitor(通路者模式):通路者模式一般是通路一個資料結構,并且對這些資料結構的成員執行一些操作,具體的操作由通路者來實作,具體案例就是群組合模式混用的GUI繪制流程。

java.awt.Graphics就是通路者抽象類,java.awt.Graphics2D也是抽象類,是Vistor功能進一步擴充,具體的實作類沒有出現在API當中,是對使用者隐藏的。把組合模式和通路者模式結合起來使用,讓結構坐标計算和具體的繪制功能實作解耦,獨立演化。例如,使用者可能會重載坐标尺寸計算部分的功能,調整Vistor的調用邏輯,但這些都不會影響到具體的繪制過程的實作代碼。

State(狀态模式):狀态模式是一個非常有用的模式,是If-Else面條代碼的必殺技,下面講解一個訂單清單的應用場景,用來處理訂單多類型和多狀态的展示。

設計模式舉例-行為型

狀态模式和政策模式比較容易混,其實兩者的運用場景有很大差別,狀态模式表達了一個對象的狀态,為不同狀态提供不同的展示,多用于GUI的場景,而政策模式多用于邏輯計算場景,使用的場景非常不同。

Strategy(政策模式:政策模式多用于業務邏輯計算的場景,例如:POS系統裡面的零售訂單折扣計算,因為商家可能會提供很多種折扣促銷方案,不同的折扣方案有不同的使用對象或者使用時間,也就是說零售單據會有多個政策,根據情況動态的決定使用的政策。測試模式也是一個非常好的IF-ELSE面條代碼的必殺技。

設計模式舉例-行為型

所有的零售折扣政策都實作了相同的接口,調用函數可以根據傳入的零售訂單order對象的情況決定執行哪種折扣政策,折扣政策有幾十種,但沒有IF-ELSE的判斷語句出現。

Chain of Responsibility(責任鍊模式):責任鍊可以看作是一系列的生産線,傳遞的東西就是需要操作的産品,運用場景:Struts2和SpringMVC中的Interceptor的設計,如下圖:

設計模式舉例-行為型

運用了責任鍊模式,使用者可以自由配置這些interceptor,客戶化自己的處理流程,比如加入日志處理和登陸驗證處理等等,讓架構功能變得容易擴充。

Template Method(模闆方法模式):模闆方法是一個高頻率使用的設計模式,例如,多個類有部分相同的處理流程,這時候最好使用模闆方法模式,把相同的處理邏輯抽象歸納到基類裡面,同時聲明一個protected方法,子類可以重載,實作自己個性化的處理流程,舉一個單據CRUD的例子,大型DRP系統又很多單據需要CRUD。

設計模式舉例-行為型

使用模闆方法模式的最大優勢就是相同處理代碼可以放到基類,實作代碼最大程度的重用,而且集中化的代碼讓後期維護,日志,性能檢測變得簡單。如果不使用這個模式,如果單據儲存流程調整了,你可能需要修改幾十個地方,使用了這個模式,你隻需要修改一個地方,生産效率是幾十倍的提升。而且開發階段,一個人寫這部分代碼,大家都可以享受成果,避免團隊重複造輪子。

Mediator(中介模式):中介模式的作用就是給N個對象之間的調用進行解耦處理,大家都依賴中介,而且之間是解耦的,可以獨立變化,如下圖:

設計模式舉例-行為型

應用案例有我在美國做的物流樞紐平台,案例介紹請參看”軟體架構設計執行個體_解析”,還有阿裡的資料庫傳輸工具DataX,如下圖:

設計模式舉例-行為型

Memento(備忘錄模式):備忘錄模式使用者對象的狀态恢複,就和對象的快照一樣,應用場景:APP資料的編輯送出儲存,如果送出伺服器失敗(可以是多次重試後都失敗),則需要恢複之前的資料,是以在開啟資料編輯之前最好做個資料快照,有了這個快照也可以感覺資料是變化,如果使用者沒有修改直接退出,就可以不做儲存提示,提升APP的使用者體驗。怎麼樣高效的實作這個模式也是非常講究的,資料模型一大堆,如果每個都去實作費時費力,最好的辦法就是利用JAVA的反射機制在基類裡面實作。

設計模式舉例-行為型

Interpreter(解析器模式):使用場景很少,用于語言文法的解析,如電腦的四則運算文法解析,需要用到抽象文法樹,網上講解比較多,這裡不多講述。

Iterator(疊代器模式):使用場景比較單一,提供資料結構元素的順序通路,例如JAVA的List就實作該設計模式。

繼續閱讀