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

2021-09-25 02:56:41 字數 969 閱讀 2448

意圖

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

動機

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

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

結構

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

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

策略類strategy定義用於共通的處理介面。context使用這個介面來呼叫相應的處理。這裡的處理可以是對資料的加工,也可以只是執行某個動作。

具象策略類concretestrategy負責具體實現策略類定義的介面。只要保證介面的一致性,具象策略類可以自由地擴充套件新功能。為了達成目的,具象策略類經常需要保持某些必要的資訊。這一點也是將策略封裝成類之後乙個便利之處。

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

Aha!設計模式 73 職責鏈模式 1

意圖 傳送者的請求沿著鏈狀路徑進行傳播,直至有接收者處理為止。這種情況下接收者根據自身判斷決定是否處理某個請求,從而避免傳送者和接收者之間的耦合。動機 考慮乙個公司管理軟體,目前正管理著下面的公司 公司的很多流程都由下級員工發起,例如報告進度 取得個人資訊等。實現這些功能的難點在於 公司的組織結構可...

Aha!設計模式 54 組合模式 1

意圖 使用組合的方式管理下級要素,在實現乙個樹形資料結構的同時為各級節點提供相同的介面,使用者可以以相同的觀點看待樹上的每個節點。動機 現實世界中存在很多的樹形結構,先看兩個例子。首先是公司組織結構圖 接下來是電腦構成圖 通過觀察可以發現,這兩個例子中的樹形結構具有以下的特徵 樹上存在包含其他節點的...

Aha!設計模式 93 備忘錄模式 1)

意圖 由物件根據外部環境的要求生成儲存內部狀態的資料並交給外部儲存。外部環境在需要的時候可以將該資料返還給這個物件並恢復之前儲存的狀態。動機 經常會有需求儲存某個物件的內部狀態。例如在某些重要的系統中,為了防止操作失誤,會希望將設定內容的狀態儲存起來,從而在必要的時候有辦法將其恢復。在很多軟體中使用...