思考問題:
乙個書店的某類書是免費的,某類書是固定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 抽象策略類 將所有的策略抽象出來,在該類宣告抽象方法或者...