在設計模式中除去工廠單例等, 策略模式
應該算最常用的設計模式之一
-
在策略模式(Strategy Pattern)中,一個類的行為或其算法可以在運行時更改。這種類型的設計模式屬於行為型模式。
-
在策略模式中,我們創建表示各種策略的對象和一個行為隨着策略對象改變而改變的 context 對象。策略對象改變 context 對象的執行算法。
介紹
-
意圖:定義一系列的算法,把它們一個個封裝起來, 並且使它們可相互替換。
-
主要解決:在有多種算法相似的情況下,使用 if...else 所帶來的復雜和難以維護。
-
何時使用:一個系統有許多許多類,而區分它們的只是他們直接的行為。
-
如何解決:將這些算法封裝成一個一個的類,任意地替換。
-
關鍵代碼:實現同一個接口。
-
優點:
- 算法可以自由切換。
- 避免使用多重條件判斷。
- 擴展性良好。
-
缺點:
- 策略類會增多,導致代碼查看較為困難。
- 所有策略類都需要對外暴露。
-
使用場景:
- 如果在一個系統里面有許多類,它們之間的區別僅在於它們的行為,那么使用策略模式可以動態地讓一個對象在許多行為中選擇一種行為。
- 一個系統需要動態地在幾種算法中選擇一種。
- 如果一個對象有很多的行為,如果不用恰當的模式,這些行為就只好使用多重的條件選擇語句來實現。
示例
場景說明:
- 此處為導出功能,此時需要根據場景導出不同的數據
- 創建策略接口
public interface ExportStrategy {
default void execute() {};
default void execute(Object o) {};
}
- 創建策略工廠
@Service
public class ExportContextFactory {
@Autowired
private Map<String, ExportStrategy> contextStrategy = new ConcurrentHashMap<>();
public ExportStrategy get(String source) {
ExportStrategy exportStrategy = this.contextStrategy.get(source);
if (Objects.isNull(exportStrategy)) {
throw new IllegalArgumentException();
}
return exportStrategy;
}
}
3.多場景實現
@Component("demo1")
public class Demo1 implements ExportStrategy {
@Override
public void execute() {
// do something
}
}
@Component("demo2")
public class Demo2 implements ExportStrategy {
@Override
public void execute(Object o) {
// do something
}
}
- 調用
@Autowired
private ExportContextFactory exportContextFactory;
@Test
public void tjIntegral() {
exportContextFactory.get("demo1").execute();
Object o = new Object();
exportContextFactory.get("demo2").execute(o);
}