目錄
一.場景
1.1場景
2.2 何時使用
?2.3個人理解
二. 業務場景練習
?2.1業務:
2.2具體實現
2.3思路?
?三.總結
3.1策略模式的特點:
?3.2策略模式優點
3.3策略模式缺點
一.場景
1.1場景
- 許多相關的類僅僅是行為有異,也就是說業務代碼需要根據場景不同,切換不同的實現邏輯
- 一個類定義了多種行為,并且這些行為在類的操作中以多個條件語句的形式出現,也就是說代碼中存在大量 if else 邏輯判斷
2.2 何時使用
? ?當一件任務可以使用不同的方式來完成,就可以使用策略模式?
?2.3個人理解
? 策略模式簡單理解,應該是對于同一個業務功能,在不同的場景需求下提供不同的實現邏輯,來達到動態切換業務算法,滿足不同場景的目的。同時它也有另外的好處,即優化代碼結構,使其脫離大量邏輯判斷,對外只提供 Context上下文,讓算法與實際業務代碼解耦,對使用者屏蔽底層實現邏輯。
? 對于我們根據不同的場景, 會定義應對不同場景相應的方法, 然而這些方法就是我們的策略,?
策略模式 UML類圖如下:
?每個策略通過不同業務條件, 找到相應的算法類或邏輯類 , 最終得到想要的結果?
二. 業務場景練習
?2.1業務:
? ? ?我們出行會根據不同的交通方式,制定不同的出行方式,比如:自駕、大巴車、高鐵、飛機,而每出行方式就是一個定義一個策略。
2.2具體實現
首先:定義一個出行接口
/*** 描述:出行策略接口** @author QU* @date 2023/8/10*/
public interface TripModeStrategy {void tripModeStrategy();
}
策略一:自駕出行
/*** 描述: 自駕出行** @author QU* @date 2023/8/10*/
public class CarTripStrategy implements TripModeStrategy {@Overridepublic void tripModeStrategy() {System.out.println("自駕出行,花費200元,用時6個小時");}
}
策略二:大巴出行
/*** 描述: 公交車出行** @author QU* @date 2023/8/10*/
public class BusTripStrategy implements TripModeStrategy {@Overridepublic void tripModeStrategy() {System.out.println("公交車出行,花費100元,用時8個小時");}
}
策略三:高鐵出行
/*** 描述: 高鐵出行** @author QU* @date 2023/8/10*/
public class HighSpeedTripStrategy implements TripModeStrategy {@Overridepublic void tripModeStrategy() {System.out.println("高鐵出行,花費500元,用時2.5小時");}
}
策略四:飛機出行
/*** 描述: 飛機出行** @author QU* @date 2023/8/10*/
public class AircraftTripStrategy implements TripModeStrategy {@Overridepublic void tripModeStrategy() {System.out.println("飛機出行,花費1000元,用時1個小時");}
}
制定策略輸出類
package strategy.trip;/*** 描述: 策略輸出** @author QU* @date 2023/8/10*/
public class TripMode {//注入策略private TripModeStrategy tripModeStrategy;TripMode(TripModeStrategy tripModeStrategy){this.tripModeStrategy=tripModeStrategy;}//輸出具體策略public void executeTripStrategy(){tripModeStrategy.tripModeStrategy();}
}
制定策略工廠
/*** 描述: 策略工廠** @author QU* @date 2023/8/10*/
public class TripStrategyFactory {/*** 定義map存放所有策略.*/private static final Map<String,TripModeStrategy> TRIP_MODE_STRATEGY_MAP=new HashMap<>();/*** 使用靜態方法來加載策略到map中*/static{TRIP_MODE_STRATEGY_MAP.put(TripEnum.CAR,new CarTripStrategy());TRIP_MODE_STRATEGY_MAP.put(TripEnum.BUS,new BusTripStrategy());TRIP_MODE_STRATEGY_MAP.put(TripEnum.HIGH_SPEED,new HighSpeedTripStrategy());TRIP_MODE_STRATEGY_MAP.put(TripEnum.AIRCRAFT,new AircraftTripStrategy());}/*** 使用靜態方法通過模擬客戶端傳接的類型(參數)** @param key 策略類型(客戶端用戶選擇的出行方式)* @return 具體某條策略*/public static TripModeStrategy tripModeStrategy(String key){TripModeStrategy tripModeStrategy = TRIP_MODE_STRATEGY_MAP.get(key);return tripModeStrategy;}
制定出行類型(出行常量)也可以認為我們wed或實際開發項目中的客戶端選擇的一條策略(用戶選擇的出行方式)
/*** 描述: 出行常量** @author QU* @date 2023/8/10*/
public class TripEnum {public static final String CAR="car";public static final String BUS="bus";public static final String HIGH_SPEED="high_speed";public static final String AIRCRAFT="aircraft";
}
測試類:
/*** 描述: 測試出行方式** @author QU* @date 2023/8/10*/
public class TripTest {public static void main(String[] args) {//自駕TripModeStrategy tripModeStrategy = TripStrategyFactory.tripModeStrategy(TripEnum.CAR);//大巴車//tripModeStrategy = TripStrategyFactory.tripModeStrategy(TripEnum.BUS);//高鐵//tripModeStrategy = TripStrategyFactory.tripModeStrategy(TripEnum.HIGH_SPEED);//飛機tripModeStrategy = TripStrategyFactory.tripModeStrategy(TripEnum.AIRCRAFT);TripMode tripMode=new TripMode(tripModeStrategy);tripMode.executeTripStrategy();}
}
運行結果:這里根據程序運行選擇就近原則(最后取變量值),預測是策略四飛機出行
結果:
2.3思路?
- 首先根據業務制定出行策略(TripModeStrategy?)
- 制定策略工廠將策略裝進我們的靜態代碼塊在工程啟動已執行到map中,靜態方法等待調用(tripModeStrategy(String key))
- 制定策略輸出類,通過客戶端選擇出行方式去策略工廠中獲取靜態方法輸出策略
?三.總結
3.1策略模式的特點:
高內聚低耦合,可擴展,遵循ocp原則(開放封閉原則)
?3.2策略模式優點
1.策略模式的功能就是通過抽象、封裝來定義一系列的算法,使得這些算法可以相互替換,所以為這些算法定義一個公共的接口,以約束這些算法的功能實現。如果這些算法具有公共的功能,可以將接口變為抽象類,將公共功能放到抽象父類里面。
2.策略模式的一系列算法是可以相互替換的、是平等的,寫在一起就是if-else組織結構,如果算法實現里又有條件語句,就構成了多重條件語句,可以用策略模式,避免這樣的多重條件語句。
3.擴展性更好:在策略模式中擴展策略實現非常的容易,只要新增一個策略實現類,然后在使用策略實現的地方,使用這個新的策略實現就好了。
3.3策略模式缺點
1.客戶端必須了解所有的策略,清楚它們的不同:
如果由客戶端來決定使用何種算法,那客戶端必須知道所有的策略,清楚各個策略的功能和不同,這樣才能做出正確的選擇,但是這暴露了策略的具體實現。
2.增加了對象的數量:
由于策略模式將每個具體的算法都單獨封裝為一個策略類,如果可選的策略有很多的話,那對象的數量也會很多。
3.只適合偏平的算法結構:
由于策略模式的各個策略實現是平等的關系(可相互替換),實際上就構成了一個扁平的算法結構。即一個策略接口下面有多個平等的策略實現(多個策略實現是兄弟關系),并且運行時只能有一個算法被使用。這就限制了算法的使用層級,且不能被嵌套。