Aha!設計模式(102)-策略模式(1)

Aha!設計模式(102)-策略模式(1)

意圖

為一系列算法定義共通的接口,使它們可以相互替換。

動機

假設我們有個數據處理軟件,當它取得數據之後需要進行某些處理。這些處理可以簡單,例如限幅,求絕對值等,也可能比較複雜,如移動平均,計算差分等。一般來講,如果將這些處理單獨考慮的時候難度不會太大。但是有一點比較麻煩的是,根據數據和需求的不同,可能需要不同形式的處理。更加麻煩的是,具體的輸入數據的類型,需求需要等到軟件執行時才可以確定,也就是說需要動態替換這些處理。

為了解決這個問題我們可以定義共通的接口來抽象這些處理。對於上面的例子來說,定義一個y=f(x)應該就可以滿足要求。對於任意一個輸出,只要產生適當的輸出即可。對於移動平均等處理來說,可能會稍微麻煩一些,但也無非就是內部再準備一個緩衝區以管理過去一段時間的數據就可以解決問題。

Aha!設計模式(102)-策略模式(1)


結構

當某些處理可以抽象出相同的接口,只是內部具體的行為有所不同時,可以使用策略模式從而實現動態變更處理內容的目的。


Aha!設計模式(102)-策略模式(1)

本圖引用自《設計模式》一書

策略類Strategy定義用於共通的處理接口。Context使用這個接口來調用相應的處理。這裡的處理可以是對數據的加工,也可以只是執行某個動作。

具象策略類ConcreteStrategy負責具體實現策略類定義的接口。只要保證接口的一致性,具象策略類可以自由地擴展新功能。為了達成目的,具象策略類經常需要保持某些必要的信息。這一點也是將策略封裝成類之後一個便利之處。

Aha!設計模式(102)-策略模式(1)

上下文類Context類首先需要管理一個策略類對象的參照。根據用戶的指定或者其他方式,這個參照可指向任意一個具體具象策略類ConcreteStrategy。但數據處理流程執行時,上下文類還負責為策略對象提供輸入數據和取出輸出數據。決定策略的上下文,管理和使用策略的上下文不一定是同一個對象。


覺得本文有幫助?請分享給更多人。

關注【面向對象思考】,輕鬆學習每一天!

面向對象設計,面向對象編程,面向對象思考


分享到:


相關文章: