策略模式(行為型)

2021-07-11 16:23:52 字數 2128 閱讀 9683

思考問題:

乙個書店的某類書是免費的,某類書是固定1元的,某類書是按折扣算的(比如88%)(同一類別的書本**一樣)。假定顧客只買一類書,在設計書店bookstore類時應該如何計算顧客買書的費用?

解答:

1. 你有可能不知道如何設計,畢竟上面的計算規則不一樣(並不是一類書8折另一類書9折那樣好計算);

2. 既然這樣,我們就定義乙個介面(策略介面),規定乙個方法(strategyinte***ce())為計算金額的方法,bookstore類構造物件時傳入該策略介面的實現類物件(在構造該物件時告訴它買多少本書,單價多少錢),那麼呼叫該介面的方法即可獲得計算好的金額。

上面例項的**就不編了,給出乙個通用的策略模式模板吧:

抽象策略類(用於規定策略類的策略方法簽名):

package com.shusheng.srategy;

/**抽象策略類*/

public

abstract

class

strategy

具體策略實現類:

package com.shusheng.srategy;

/**具體策略實現類*/

public

class

concretestrategy1

extends

strategy

}

具體策略類2:

package com.shusheng.srategy;

/**具體策略*/

public

class

concretestrategy2

extends

strategy

}

上下文類(上下文角色,作用:封裝策略模式,避免外界直接呼叫策略類的方法)

package com.shusheng.srategy;

/**上下文類(上下文角色)*/

public

class

context

/**呼叫策略,比如這個就是bookstore的計算金額的方法*/

public

void

contextinte***ce()

}

測試類:

策略模式優點:

1. 策略模式提供了管理相關的演算法族的辦法。(外界不需要知道內部是怎麼實現的,只需要呼叫context類的方法即可)

2. 使用策略模式可以避免使用多重條件if-else語句,實現細節:定義乙個策略類介面(規定好策略方法),將if內部**封裝為乙個策略實現類的方法,else內部**也封裝為另乙個策略實現類的方法。(假設含if-else語句的類為context),context類中使用到if-else的地方直接替換為呼叫策略介面類的策略方法,當構造context時傳入具體的策略物件即可。這樣在原先呼叫if-else的地方就會呼叫策略類的方法。

策略模式缺點:

1. 正如優點中對if-else的解說,客戶端類必須知道哪乙個策略類的具體功能是什麼的,才能傳入正確的策略物件,這意味著:別人使用該介面是必須理解這些策略演算法的區別;即策略模式只適用於客戶知道所有的演算法或行為的情況。

2. 使用策略模式會造成很多的策略類,正如if-(else if) - (else if) -(else if) -else這樣,就會產生很多策略類(每種情況乙個類)。當然也可以用享元模式來減少物件的數量。

策略模式 的應用場景:

1. 多個類只是在演算法或行為上稍有不同的場景(就可以把不同的演算法或行為部分提取出來設計成策略模式)

2. 演算法需要自由切換的場景

3. 需要遮蔽演算法規則的場景(就是策略函式內部實現是遮蔽的,外界只是呼叫context的方法)

行為型 策略模式

注入物件,改變行為。這是乙個很有意思的模式,它可以有多種表現形式,只要滿足注入物件,改變行為。學習這個模式,必須忘記網上和書上的標準類圖。注入不同的comparator,排序的方式也不同。這是最常見的策略模式的表現形式,沒必要畫什麼圖。與上乙個策略模式比較,有點主客顛倒的意思。class beanc...

行為型(一) 策略模式

1 定義 define a family of algorithms,encapsulate each one,and make them interchangeable.定義一組演算法,將每個演算法都封裝起來,並且使它們之間可以互換。2 使用場景 多個類只是在演算法或行為上稍有不同 演算法需要自由...

設計模式 行為型 策略模式

更好的實現開閉原則 ocp,openclosedprinciple 即對於擴充套件是開放的,對於修改是關閉的,不修改原有 只擴充套件 策略模式包括三個角色 context 環境類 使用演算法策略,維持乙個抽象策略類的引用例項 strategy 抽象策略類 將所有的策略抽象出來,在該類宣告抽象方法或者...