一郎嫁、策略模式
在策略(Strategy Pattern)中,一個類的行為或算法可以在運(yùn)行時動態(tài)的更改。這種類型的設(shè)計(jì)模式屬于行為模式(Behavioral Pattern-對象間通信)蝠咆。
在策略模式中,我們創(chuàng)建表示各種策略的對象和一個行為隨著策略對象改變而改變的context對象谈况。策略對象改變context對象的執(zhí)行算法。
二递胧、介紹
意圖: 定義一系列算法碑韵,把它們一個個封裝起來,并且是她們可互相替換缎脾。
Define a family of algorithms, encapsulate each one, and make them interchangeable
主要解決: 在有多種算法相似的情況下祝闻,使用if...else 所帶來的復(fù)雜和難以維護(hù)。
何時使用: 一個系統(tǒng)中有許多許多類遗菠,而區(qū)分它們的只是它們直接的行為联喘。
如何解決: 將這些算法封裝成一個一個類,任意替換辙纬。
關(guān)鍵代碼: 實(shí)現(xiàn)同一個接口豁遭。
應(yīng)用實(shí)例:
- 諸葛亮的錦囊妙計(jì),每個錦囊就是一個策略贺拣。
- 旅行的出游方式蓖谢,選擇,??譬涡,闪幽,,涡匀,每一種旅行方式都是一個策略盯腌。
- Java AWT 中的LayoutManager。(這個不熟悉)
優(yōu)點(diǎn):
- 算法可以自由的切換陨瘩。
- 避免使用多重條件判斷腕够。
- 擴(kuò)展性良好级乍。
缺點(diǎn):
- 策略類會增多。
- 所有的策略類都需要對外暴露燕少。
使用場景: - 如果在一個系統(tǒng)中有許多類卡者,它們之間的區(qū)別僅在于它們的行為,那么使用策略模式可以動態(tài)地讓一個對象在許多行為中選擇一種行為客们。
- 一個系統(tǒng)需要動態(tài)地在幾種算法中選擇一種崇决。
- 如果一個對象有許多行為,如果不用恰當(dāng)?shù)哪J降状欤@些行為就只好使用多重的條件選擇語句來實(shí)現(xiàn)恒傻。
注意事項(xiàng): 如果一個系統(tǒng)中的策略多于4個,就是需要考慮使用混合模式建邓,解決策略模式膨脹的問題盈厘。
三、實(shí)現(xiàn)
類結(jié)構(gòu)圖如下:
- Context角色:起承上啟下封裝作用官边,屏蔽高層模塊對策略沸手、算法的直接訪問,封裝可能存在的變化注簿。
- Strategy抽象策略角色:策略契吉、算法家族的抽象,通常為接口诡渴,定義每個策略或算法必須具有的方法和屬性捐晶。
- ConcreteStrategy具體策略角色:實(shí)現(xiàn)抽象策略中的操作,該類含有具體的算法妄辩。
- 創(chuàng)建策略接口(Strategy):
public interface Strategy {
int doOperation(int operator1, int operator2);
}
- 創(chuàng)建策略具體算法實(shí)現(xiàn)類(OperationAdd惑灵、OperationMultiply、OperationSubstract):
public class OperationAdd implements Strategy {
@Override
public int doOperation(int operator1, int operator2) {
return operator1 + operator2;
}
}
- 創(chuàng)建Context類:
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public int executeStrategy(int operator1, int operator2) {
return strategy.doOperation(operator1, operator2);
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
}
- 使用 Context 來查看當(dāng)它改變策略 Strategy 時的行為變化眼耀。
public class Test {
public static void main(String[] args) {
int operator1 = 10;
int operator2 = 2;
int result = 0;
Context ctx = new Context(new OperationAdd());
result = ctx.executeStrategy(operator1, operator2);
System.out.println(operator1 + " + " + operator2 + " = " + result);
ctx.setStrategy(new OperationMultiply());
result = ctx.executeStrategy(operator1, operator2);
System.out.println(operator1 + " * " + operator2 + " = " + result);
ctx.setStrategy(new OperationSubstract());
result = ctx.executeStrategy(operator1, operator2);
System.out.println(operator1 + " - " + operator2 + " = " + result);
}
}
- 結(jié)果