第三章 策略模式
- 在策略模式(Strategy Pattern)中,一個(gè)類的行為或其算法可以在運(yùn)行時(shí)更改。這種類型的設(shè)計(jì)模式屬于行為型模式
- 在策略模式中,我們創(chuàng)建表示各種策略的對(duì)象和一個(gè)行為隨著策略對(duì)象改變而改變的 context 對(duì)象。策略對(duì)象改變 context 對(duì)象的執(zhí)行算法。
3.1 介紹
- 意圖:定義一系列的算法,把它們一個(gè)個(gè)封裝起來(lái), 并且使它們可相互替換
- 主要解決:在有多種算法相似的情況下,使用
if...else所帶來(lái)的復(fù)雜和難以維護(hù) - 何時(shí)使用:一個(gè)系統(tǒng)有許多許多類,而區(qū)分它們的只是他們直接的行為
- 如何解決:將這些算法封裝成一個(gè)一個(gè)的類,任意地替換
- 關(guān)鍵代碼:實(shí)現(xiàn)同一個(gè)接口
- 應(yīng)用實(shí)例:
- 諸葛亮的錦囊妙計(jì),每一個(gè)錦囊就是一個(gè)策略
- 旅行的出游方式,選擇騎自行車、坐汽車,每一種旅行方式都是一個(gè)策略。
- 優(yōu)點(diǎn):
- 算法可以自由切換
- 避免使用多重條件判斷
- 擴(kuò)展性良好
- 缺點(diǎn):
- 策略類會(huì)增多
- 所有策略類都需要對(duì)外暴露
- 使用場(chǎng)景:
- 如果在一個(gè)系統(tǒng)里面有許多類,它們之間的區(qū)別僅在于它們的行為,那么使用策略模式可以動(dòng)態(tài)地讓一個(gè)對(duì)象在許多行為中選擇一種行為
- 一個(gè)系統(tǒng)需要?jiǎng)討B(tài)地在幾種算法中選擇一種
- 如果一個(gè)對(duì)象有很多的行為,如果不用恰當(dāng)?shù)哪J?,這些行為就只好使用多重的條件選擇語(yǔ)句來(lái)實(shí)現(xiàn)
- 注意事項(xiàng):如果一個(gè)系統(tǒng)的策略多于四個(gè),就需要考慮使用混合模式,解決策略類膨脹的問(wèn)題
3.2 UML
一個(gè)定義活動(dòng)的
Strategy接口和實(shí)現(xiàn)了Strategy接口的實(shí)體策略類。Context是一個(gè)使用了某種策略的類

策略模式.png
3.3 代碼
-
創(chuàng)建一個(gè)接口
public interface Strategy { /*定義算法抽象方法*/ int doOperation(int num1,int num2); } -
創(chuàng)建實(shí)現(xiàn)接口的實(shí)體類
//加法 public class OperationAdd implements Strategy { public int doOperation(int num1, int num2) { return num1 + num2; } } //減法 public class OperationSub implements Strategy { public int doOperation(int num1, int num2) { return num1 - num2; } } //乘法 public class OperationMult implements Strategy { public int doOperation(int num1, int num2) { return num1 * num2; } } -
創(chuàng)建Context類
public class Context { private Strategy strategy; public Context(Strategy strategy) { this.strategy = strategy; } public void setStrategy(Strategy strategy) { this.strategy = strategy; } public void executeStrategy(int num1, int num2){ int result = strategy.doOperation(num1,num2); System.out.println(result); } } -
結(jié)果
------加法-------- 8 -------減法------- 2 -------乘法------- 15