Java設(shè)計(jì)模式之策略模式解析
一. 簡(jiǎn)介
1. 什么是策略模式?
在策略模式(Strategy Pattern)中,一個(gè)類的行為或其算法可以在運(yùn)行時(shí)更改。這種類型的設(shè)計(jì)模式屬于行為型模式。 在策略模式中,我們創(chuàng)建表示各種策略的對(duì)象和一個(gè)行為隨著策略對(duì)象改變而改變的 context 對(duì)象。策略對(duì)象改變 context 對(duì)象的執(zhí)行算法。
2. 策略模式的應(yīng)用場(chǎng)景?
- 如果在一個(gè)系統(tǒng)里面有許多類,它們之間的區(qū)別僅在于它們的行為,那么使用策略模式可以動(dòng)態(tài)地讓一個(gè)對(duì)象在許多行為中選擇一種行為
- 一個(gè)系統(tǒng)需要?jiǎng)討B(tài)地在幾種算法中選擇一種
- 如果一個(gè)對(duì)象有很多的行為,如果不用恰當(dāng)?shù)哪J剑@些行為就只好使用多重的條件選擇語(yǔ)句來(lái)實(shí)現(xiàn)
二. 策略模式的使用
我們來(lái)模擬一個(gè)商城系統(tǒng)創(chuàng)建不同活動(dòng)的需求,假設(shè)我們需要根據(jù)傳入的type來(lái)判斷創(chuàng)建所要?jiǎng)?chuàng)建的活動(dòng),傳統(tǒng)的方式我們可能或通過(guò)if()---else()的方式去判斷索要?jiǎng)?chuàng)建的活動(dòng)類類型,如果類型多的話這樣的判斷就會(huì)顯得代碼很凌亂。那么我們可以嘗試著用策略模式去優(yōu)化這種邏輯。
下面我們模擬三種不同活動(dòng)的創(chuàng)建
- 創(chuàng)建策略枚舉類
/**
* @author gf
* @date 2023/2/7
*/
@Getter
@AllArgsConstructor
public enum ActivityTypeEnum {
MANJIAN(101, "滿減活動(dòng)"),
MANZHE(102, "滿折活動(dòng)"),
PRESALE(103, "預(yù)售活動(dòng)");
int type;
String desc;
}- 創(chuàng)建活動(dòng)接口
/**
* @author gf
* @date 2023/2/7
*/
public interface ActivityService {
/**
* 創(chuàng)建活動(dòng)
*
* @return
*/
void createActivity();
/**
* 獲取訂單類型
*
* @return
*/
ActivityTypeEnum type();
}- 創(chuàng)建活動(dòng)實(shí)現(xiàn)類
接下來(lái)我們分別創(chuàng)建滿減,滿折和預(yù)售的實(shí)現(xiàn)類
- 滿減實(shí)現(xiàn)類:
/**
* @author gf
* @date 2023/2/7
*/
@Slf4j
@Service
public class ManJianActivityImpl implements ActivityService {
@Override
public void createActivity() {
log.info("----創(chuàng)建滿減活動(dòng)----");
}
@Override
public ActivityTypeEnum type() {
return ActivityTypeEnum.MANJIAN;
}
}- 滿折實(shí)現(xiàn)類:
/**
* @author gf
* @date 2023/2/7
*/
@Slf4j
@Service
public class ManZheActivityImpl implements ActivityService {
@Override
public void createActivity() {
log.info("----創(chuàng)建滿折活動(dòng)----");
}
@Override
public ActivityTypeEnum type() {
return ActivityTypeEnum.MANZHE;
}
}- 預(yù)售實(shí)現(xiàn)類:
/**
* @author gf
* @date 2023/2/7
*/
@Slf4j
@Service
public class PreSaleActivityImpl implements ActivityService {
@Override
public void createActivity() {
log.info("----創(chuàng)建預(yù)售活動(dòng)----");
}
@Override
public ActivityTypeEnum type() {
return ActivityTypeEnum.PRESALE;
}
}- 創(chuàng)建活動(dòng)創(chuàng)建通用接口
/**
* @author gf
* @date 2023/2/7
*/
@RestController
public class ActivityController {
@Autowired
private List<ActivityService> activityService;
/**
* 創(chuàng)建活動(dòng)
*
* @param type 活動(dòng)類型
* @return
*/
public void createActivity(int type) {
/**
* 根據(jù)動(dòng)類型,找到對(duì)應(yīng)的處理器
*/
Optional<ActivityService> any = activityService.stream().filter(f -> f.type().getType() == type).findAny();
/**
* 沒(méi)有對(duì)應(yīng)的處理器
*/
if (!any.isPresent()) {
throw new RuntimeException("沒(méi)有找到相應(yīng)的活動(dòng)實(shí)現(xiàn)");
}
// 創(chuàng)建訂單
any.get().createActivity();
}
}測(cè)試活動(dòng)創(chuàng)建
@SpringBootTest
class DesignApplicationTests {
@Autowired
private ActivityController activityController;
@Test
void contextLoads() {
activityController.createActivity(ActivityTypeEnum.MANJIAN.getType());
}
}
搞定,看是不是很方便,省去了很多的if--else的判斷和接口的注入
三. 策略模式的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
- 算法可以自由切換;
- 避免使用多重判斷;
- 拓展性良好,增加一個(gè)策略只需要實(shí)現(xiàn)接口即可;
缺點(diǎn):
- 策略類數(shù)量會(huì)增多,每個(gè)策略都是一個(gè)類,復(fù)用性很?。?/li>
- 所有的策略類都需要對(duì)外暴露
到此這篇關(guān)于Java設(shè)計(jì)模式之策略模式解析的文章就介紹到這了,更多相關(guān)Java策略模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
2022年最新java?8?(?jdk1.8u321)安裝圖文教程
這篇文章主要介紹了2022年最新java?8?(?jdk1.8u321)安裝圖文教程,截止2022年1月,官方出的jdk1.8目前已更新到8u321的版本,本文通過(guò)圖文并茂的形式給大家介紹安裝過(guò)程,需要的朋友可以參考下2022-08-08
Dubbo3和Spring?Boot整合過(guò)程源碼解析
Dubbo首先是提供了一個(gè)單獨(dú)的模塊來(lái)和Spring Boot做整合,利用 Spring Boot自動(dòng)裝配的功能,配置了一堆自動(dòng)裝配的組件,本文介紹Dubbo3和Spring?Boot整合過(guò)程,需要的朋友一起看看吧2023-08-08
Java實(shí)現(xiàn)Elasticsearch查詢當(dāng)前索引全部數(shù)據(jù)的完整代碼
這篇文章主要介紹了如何在Java中實(shí)現(xiàn)查詢Elasticsearch索引中指定條件下的全部數(shù)據(jù),通過(guò)設(shè)置滾動(dòng)查詢參數(shù)(scroll),可以一次性獲取滿足條件的數(shù)據(jù),而不需要限制每頁(yè)的查詢條數(shù)大小,這樣可以避免因數(shù)據(jù)量過(guò)大而引發(fā)的性能問(wèn)題,需要的朋友可以參考下2025-02-02
Spring Boot2深入分析解決java.lang.ArrayStoreException異常
這篇文章介紹了Spring Boot2深入分析解決java.lang.ArrayStoreException異常的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12
解決lombok的@Data注解無(wú)法打印繼承的父類信息問(wèn)題
在Java編程中,使用@Data注解可能導(dǎo)致子類繼承父類屬性后,打印只顯示子類信息不顯示父類信息,問(wèn)題源于@Data注解作用域僅限于當(dāng)前類,解決方法包括使用@ToString(callSuper=true)注解或重寫(xiě)toString方法2024-11-11
Java數(shù)據(jù)結(jié)構(gòu)之HashMap源碼深入分析
Java HashMap是一種基于哈希表實(shí)現(xiàn)的鍵值對(duì)存儲(chǔ)結(jié)構(gòu),可以實(shí)現(xiàn)快速的數(shù)據(jù)查找和存儲(chǔ)。它是線程不安全的,但在單線程環(huán)境中運(yùn)行效率高,被廣泛應(yīng)用于Java開(kāi)發(fā)中2023-04-04
Java圖形界面開(kāi)發(fā)之簡(jiǎn)易記事本
這篇文章主要為大家詳細(xì)介紹了Java圖形界面開(kāi)發(fā)之簡(jiǎn)易記事本的制作方法,,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10

