簡介
在策略模式(Strategy Pattern)中度苔,一個類的行為或其算法可以在運(yùn)行時(shí)更改。這種類型的設(shè)計(jì)模式屬于行為型模式浑度。簡單理解就是一組算法寇窑,可以互換,再簡單點(diǎn)策略就是封裝算法箩张。
意圖 定義一系列的算法,把它們一個個封裝起來, 并且使它們可相互替換甩骏。
主要解決 在有多種算法相似的情況下,使用 if...else 所帶來的復(fù)雜和難以維護(hù)先慷。
何時(shí)使用 一個系統(tǒng)有許多許多類饮笛,而區(qū)分它們的只是他們直接的行為。
如何解決 將這些算法封裝成一個一個的類论熙,任意地替換福青。
主要角色
- 上下文Context,擁有一個Strategy的引用
- 抽象策略Strategy脓诡,往往是一個接口(占大部分情況)或者抽象類无午,通常提供各種具體策略的接口
- 具體策略,這就是重點(diǎn)了祝谚,封裝了各種具體的算法
UML
img
應(yīng)用實(shí)例
- 諸葛亮的錦囊妙計(jì)宪迟,每一個錦囊就是一個策略;
- 旅行的出游方式交惯,選擇騎自行車次泽、坐汽車,每一種旅行方式都是一個策略商玫;
- JAVA AWT 中的 LayoutManager箕憾;
優(yōu)點(diǎn) 1、算法可以自由切換拳昌。 2袭异、避免使用多重條件判斷。 3炬藤、擴(kuò)展性良好御铃。
缺點(diǎn) 1、策略類會增多沈矿。 2上真、所有策略類都需要對外暴露。
使用場景
- 如果在一個系統(tǒng)里面有許多類羹膳,它們之間的區(qū)別僅在于它們的行為睡互,那么使用策略模式可以動態(tài)地讓一個對象在許多行為中選擇一種行為。
- 一個系統(tǒng)需要動態(tài)地在幾種算法中選擇一種。
- 如果一個對象有很多的行為就珠,如果不用恰當(dāng)?shù)哪J娇芸牵@些行為就只好使用多重的條件選擇語句來實(shí)現(xiàn)。
注意事項(xiàng): 如果一個系統(tǒng)的策略多于四個妻怎,就需要考慮使用混合模式壳炎,解決策略類膨脹的問題。
項(xiàng)目描述
1.操作行為
simple1包逼侦,主要對操作行為包裝了加減乘除方法匿辩。
@Slf4j
public class Application {
public static void main(String[] args) {
Context context = new Context(new AddStrategy());
log.info("10 + 5 = {}", context.executeStrategy(10, 5));
context.setStrategy(new SubstractStrategy());
log.info("10 - 5 = {}", context.executeStrategy(10, 5));
context.setStrategy(new MultiplyStrategy());
log.info("10 * 5 = {}", context.executeStrategy(10, 5));
context.setStrategy(new DivideStrategy());
log.info("10 / 5 = {}", context.executeStrategy(10, 5));
}
}
執(zhí)行結(jié)果
img
2.出現(xiàn)方式
simple2包描述,主要對出行方式的包裝榛丢,包裝了3種出行方式铲球,
執(zhí)行類
public class TravelApplication {
public static void main(String[] args) {
Context context = new Context(new BusStrategy());
context.executeStrategy("老王”);
context.setStrategy(new BicycleStrategy());
context.executeStrategy("老張”);
context.setStrategy(new WalkStrategy());
context.executeStrategy("老李”);
}
}
執(zhí)行結(jié)果
<u>image-20181222104657926
</u>
策略上下文
@Data
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
/**
* 出行
*
* @return
*/
public void executeStrategy(String name) {
strategy.travel(name);
}
}
抽象策略
public interface Strategy {
/**
* 出現(xiàn)方法
*
* @return
*/
void travel(String name);
}