第三章 策略模式
- 在策略模式(Strategy Pattern)中昼蛀,一個(gè)類的行為或其算法可以在運(yùn)行時(shí)更改丐枉。這種類型的設(shè)計(jì)模式屬于行為型模式
- 在策略模式中披摄,我們創(chuàng)建表示各種策略的對象和一個(gè)行為隨著策略對象改變而改變的 context 對象淳玩。策略對象改變 context 對象的執(zhí)行算法牙勘。
3.1 介紹
- 意圖:定義一系列的算法,把它們一個(gè)個(gè)封裝起來, 并且使它們可相互替換
- 主要解決:在有多種算法相似的情況下莫绣,使用
if...else
所帶來的復(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):
- 策略類會增多
- 所有策略類都需要對外暴露
- 使用場景:
- 如果在一個(gè)系統(tǒng)里面有許多類,它們之間的區(qū)別僅在于它們的行為管跺,那么使用策略模式可以動態(tài)地讓一個(gè)對象在許多行為中選擇一種行為
- 一個(gè)系統(tǒng)需要動態(tài)地在幾種算法中選擇一種
- 如果一個(gè)對象有很多的行為义黎,如果不用恰當(dāng)?shù)哪J剑@些行為就只好使用多重的條件選擇語句來實(shí)現(xiàn)
- 注意事項(xiàng):如果一個(gè)系統(tǒng)的策略多于四個(gè)豁跑,就需要考慮使用混合模式廉涕,解決策略類膨脹的問題
3.2 UML
一個(gè)定義活動的
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