概述
策略模式(Strategy Pattern)的思想是在程式運行時動態改變某一個類的執行邏輯,屬于一種行為型設計模式,目的是為了盡可能的減少if...else代碼,它的核心在于”選擇“兩個字,每一種選擇就是一個策略,通常情況下,在選擇不多的時候,我們采用的是if...else代碼塊來實作,但是這種方式的擴展性不強,每次增加一種選擇就需要修改該if...else的原始碼,違反了開閉原則,況且一旦if...else多了起來可讀性也會變差,所以在開發中遇到”多種選擇“時,可以優先考慮一下策略模式,
使用場景
- 如:中午吃什么?米飯,面,粉等等,每一個選擇就是一種策略
- 旅游出行時,選擇什么樣的交通工具,飛機、高鐵、地鐵
如何實作
- 所有的策略實作類有一個頂層介面Strategy,介面中定義了一個執行邏輯方法
- 策略實作類實作Strategy介面,撰寫自己的執行邏輯
- 維護一個Context類,這個類的執行邏輯是可變的,每當它的策略發生改變時,其運行結果也會發生改變
代碼示例
策略介面及實作類
public interface TravelStrategy {
String doOperation();
}
public class Airplane implements TravelStrategy {
@Override
public String doOperation() {
return "飛機";
}
}
public class HighSpeedRail implements TravelStrategy {
@Override
public String doOperation() {
return "高鐵";
}
}
public class Subway implements TravelStrategy {
@Override
public String doOperation() {
return "地鐵";
}
}
可動態改變執行策略的類
public class MyTravelContext {
public String executeStrategy(TravelStrategy travelStrategy) {
return "出門旅游坐啥好: " + travelStrategy.doOperation();
}
}
測驗
public class TestStrategy {
public static void main(String[] args) {
MyTravelContext context = new MyTravelContext();
System.out.println(context.executeStrategy(new Airplane()));
System.out.println(context.executeStrategy(new HighSpeedRail()));
System.out.println(context.executeStrategy(new Subway()));
}
}
運行結果
出門旅游坐啥好: 飛機
出門旅游坐啥好: 高鐵
出門旅游坐啥好: 地鐵
框架原始碼中的應用
- spring框架中的ObjectNamingStrategy類,獲取bean的beanName
總結
優點
- 擴展性好
- 運行時自由切換執行邏輯
- 減少if...else代碼
缺點
- 策略過多時會產生大量的類
- 所有策略類都需要暴露給使用者
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/514200.html
標籤:設計模式
上一篇:流程引擎的架構設計
下一篇:初識設計模式 - 迭代器模式
