目錄
一.場(chǎng)景
1.1場(chǎng)景
2.2 何時(shí)使用
?2.3個(gè)人理解
二. 業(yè)務(wù)場(chǎng)景練習(xí)
?2.1業(yè)務(wù):
2.2具體實(shí)現(xiàn)
2.3思路?
?三.總結(jié)
3.1策略模式的特點(diǎn):
?3.2策略模式優(yōu)點(diǎn)
3.3策略模式缺點(diǎn)
一.場(chǎng)景
1.1場(chǎng)景
- 許多相關(guān)的類僅僅是行為有異,也就是說(shuō)業(yè)務(wù)代碼需要根據(jù)場(chǎng)景不同,切換不同的實(shí)現(xiàn)邏輯
- 一個(gè)類定義了多種行為,并且這些行為在類的操作中以多個(gè)條件語(yǔ)句的形式出現(xiàn),也就是說(shuō)代碼中存在大量 if else 邏輯判斷
2.2 何時(shí)使用
? ?當(dāng)一件任務(wù)可以使用不同的方式來(lái)完成,就可以使用策略模式?
?2.3個(gè)人理解
? 策略模式簡(jiǎn)單理解,應(yīng)該是對(duì)于同一個(gè)業(yè)務(wù)功能,在不同的場(chǎng)景需求下提供不同的實(shí)現(xiàn)邏輯,來(lái)達(dá)到動(dòng)態(tài)切換業(yè)務(wù)算法,滿足不同場(chǎng)景的目的。同時(shí)它也有另外的好處,即優(yōu)化代碼結(jié)構(gòu),使其脫離大量邏輯判斷,對(duì)外只提供 Context上下文,讓算法與實(shí)際業(yè)務(wù)代碼解耦,對(duì)使用者屏蔽底層實(shí)現(xiàn)邏輯。
? 對(duì)于我們根據(jù)不同的場(chǎng)景, 會(huì)定義應(yīng)對(duì)不同場(chǎng)景相應(yīng)的方法, 然而這些方法就是我們的策略,?
策略模式 UML類圖如下:
?每個(gè)策略通過(guò)不同業(yè)務(wù)條件, 找到相應(yīng)的算法類或邏輯類 , 最終得到想要的結(jié)果?
二. 業(yè)務(wù)場(chǎng)景練習(xí)
?2.1業(yè)務(wù):
? ? ?我們出行會(huì)根據(jù)不同的交通方式,制定不同的出行方式,比如:自駕、大巴車、高鐵、飛機(jī),而每出行方式就是一個(gè)定義一個(gè)策略。
2.2具體實(shí)現(xiàn)
首先:定義一個(gè)出行接口
/**
* 描述:出行策略接口
*
* @author QU
* @date 2023/8/10
*/
public interface TripModeStrategy {
void tripModeStrategy();
}
策略一:自駕出行
/**
* 描述: 自駕出行
*
* @author QU
* @date 2023/8/10
*/
public class CarTripStrategy implements TripModeStrategy {
@Override
public void tripModeStrategy() {
System.out.println("自駕出行,花費(fèi)200元,用時(shí)6個(gè)小時(shí)");
}
}
策略二:大巴出行
/**
* 描述: 公交車出行
*
* @author QU
* @date 2023/8/10
*/
public class BusTripStrategy implements TripModeStrategy {
@Override
public void tripModeStrategy() {
System.out.println("公交車出行,花費(fèi)100元,用時(shí)8個(gè)小時(shí)");
}
}
策略三:高鐵出行
/**
* 描述: 高鐵出行
*
* @author QU
* @date 2023/8/10
*/
public class HighSpeedTripStrategy implements TripModeStrategy {
@Override
public void tripModeStrategy() {
System.out.println("高鐵出行,花費(fèi)500元,用時(shí)2.5小時(shí)");
}
}
策略四:飛機(jī)出行
/**
* 描述: 飛機(jī)出行
*
* @author QU
* @date 2023/8/10
*/
public class AircraftTripStrategy implements TripModeStrategy {
@Override
public void tripModeStrategy() {
System.out.println("飛機(jī)出行,花費(fèi)1000元,用時(shí)1個(gè)小時(shí)");
}
}
制定策略輸出類
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<>();
/**
* 使用靜態(tài)方法來(lái)加載策略到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());
}
/**
* 使用靜態(tài)方法通過(guò)模擬客戶端傳接的類型(參數(shù))
*
* @param key 策略類型(客戶端用戶選擇的出行方式)
* @return 具體某條策略
*/
public static TripModeStrategy tripModeStrategy(String key){
TripModeStrategy tripModeStrategy = TRIP_MODE_STRATEGY_MAP.get(key);
return tripModeStrategy;
}
制定出行類型(出行常量)也可以認(rèn)為我們wed或?qū)嶋H開(kāi)發(fā)項(xiàng)目中的客戶端選擇的一條策略(用戶選擇的出行方式)
/**
* 描述: 出行常量
*
* @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";
}
測(cè)試類:
/**
* 描述: 測(cè)試出行方式
*
* @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);
//飛機(jī)
tripModeStrategy = TripStrategyFactory.tripModeStrategy(TripEnum.AIRCRAFT);
TripMode tripMode=new TripMode(tripModeStrategy);
tripMode.executeTripStrategy();
}
}
運(yùn)行結(jié)果:這里根據(jù)程序運(yùn)行選擇就近原則(最后取變量值),預(yù)測(cè)是策略四飛機(jī)出行
結(jié)果:
2.3思路?
- 首先根據(jù)業(yè)務(wù)制定出行策略(TripModeStrategy?)
- 制定策略工廠將策略裝進(jìn)我們的靜態(tài)代碼塊在工程啟動(dòng)已執(zhí)行到map中,靜態(tài)方法等待調(diào)用(tripModeStrategy(String key))
- 制定策略輸出類,通過(guò)客戶端選擇出行方式去策略工廠中獲取靜態(tài)方法輸出策略
?三.總結(jié)
3.1策略模式的特點(diǎn):
高內(nèi)聚低耦合,可擴(kuò)展,遵循ocp原則(開(kāi)放封閉原則)
?3.2策略模式優(yōu)點(diǎn)
1.策略模式的功能就是通過(guò)抽象、封裝來(lái)定義一系列的算法,使得這些算法可以相互替換,所以為這些算法定義一個(gè)公共的接口,以約束這些算法的功能實(shí)現(xiàn)。如果這些算法具有公共的功能,可以將接口變?yōu)槌橄箢悾瑢⒐补δ芊诺匠橄蟾割惱锩妗?/p>
2.策略模式的一系列算法是可以相互替換的、是平等的,寫(xiě)在一起就是if-else組織結(jié)構(gòu),如果算法實(shí)現(xiàn)里又有條件語(yǔ)句,就構(gòu)成了多重條件語(yǔ)句,可以用策略模式,避免這樣的多重條件語(yǔ)句。
3.擴(kuò)展性更好:在策略模式中擴(kuò)展策略實(shí)現(xiàn)非常的容易,只要新增一個(gè)策略實(shí)現(xiàn)類,然后在使用策略實(shí)現(xiàn)的地方,使用這個(gè)新的策略實(shí)現(xiàn)就好了。
3.3策略模式缺點(diǎn)
1.客戶端必須了解所有的策略,清楚它們的不同:
如果由客戶端來(lái)決定使用何種算法,那客戶端必須知道所有的策略,清楚各個(gè)策略的功能和不同,這樣才能做出正確的選擇,但是這暴露了策略的具體實(shí)現(xiàn)。
2.增加了對(duì)象的數(shù)量:
由于策略模式將每個(gè)具體的算法都單獨(dú)封裝為一個(gè)策略類,如果可選的策略有很多的話,那對(duì)象的數(shù)量也會(huì)很多。
3.只適合偏平的算法結(jié)構(gòu):文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-647943.html
由于策略模式的各個(gè)策略實(shí)現(xiàn)是平等的關(guān)系(可相互替換),實(shí)際上就構(gòu)成了一個(gè)扁平的算法結(jié)構(gòu)。即一個(gè)策略接口下面有多個(gè)平等的策略實(shí)現(xiàn)(多個(gè)策略實(shí)現(xiàn)是兄弟關(guān)系),并且運(yùn)行時(shí)只能有一個(gè)算法被使用。這就限制了算法的使用層級(jí),且不能被嵌套。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-647943.html
到了這里,關(guān)于設(shè)計(jì)模式--策略模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!