Java設(shè)計模式之策略模式解析
一. 簡介
1. 什么是策略模式?
在策略模式(Strategy Pattern)中,一個類的行為或其算法可以在運行時更改。這種類型的設(shè)計模式屬于行為型模式。 在策略模式中,我們創(chuàng)建表示各種策略的對象和一個行為隨著策略對象改變而改變的 context 對象。策略對象改變 context 對象的執(zhí)行算法。
2. 策略模式的應用場景?
- 如果在一個系統(tǒng)里面有許多類,它們之間的區(qū)別僅在于它們的行為,那么使用策略模式可以動態(tài)地讓一個對象在許多行為中選擇一種行為
- 一個系統(tǒng)需要動態(tài)地在幾種算法中選擇一種
- 如果一個對象有很多的行為,如果不用恰當?shù)哪J?,這些行為就只好使用多重的條件選擇語句來實現(xiàn)
二. 策略模式的使用
我們來模擬一個商城系統(tǒng)創(chuàng)建不同活動的需求,假設(shè)我們需要根據(jù)傳入的type來判斷創(chuàng)建所要創(chuàng)建的活動,傳統(tǒng)的方式我們可能或通過if()---else()的方式去判斷索要創(chuàng)建的活動類類型,如果類型多的話這樣的判斷就會顯得代碼很凌亂。那么我們可以嘗試著用策略模式去優(yōu)化這種邏輯。
下面我們模擬三種不同活動的創(chuàng)建
- 創(chuàng)建策略枚舉類
/**
* @author gf
* @date 2023/2/7
*/
@Getter
@AllArgsConstructor
public enum ActivityTypeEnum {
MANJIAN(101, "滿減活動"),
MANZHE(102, "滿折活動"),
PRESALE(103, "預售活動");
int type;
String desc;
}- 創(chuàng)建活動接口
/**
* @author gf
* @date 2023/2/7
*/
public interface ActivityService {
/**
* 創(chuàng)建活動
*
* @return
*/
void createActivity();
/**
* 獲取訂單類型
*
* @return
*/
ActivityTypeEnum type();
}- 創(chuàng)建活動實現(xiàn)類
接下來我們分別創(chuàng)建滿減,滿折和預售的實現(xiàn)類
- 滿減實現(xiàn)類:
/**
* @author gf
* @date 2023/2/7
*/
@Slf4j
@Service
public class ManJianActivityImpl implements ActivityService {
@Override
public void createActivity() {
log.info("----創(chuàng)建滿減活動----");
}
@Override
public ActivityTypeEnum type() {
return ActivityTypeEnum.MANJIAN;
}
}- 滿折實現(xiàn)類:
/**
* @author gf
* @date 2023/2/7
*/
@Slf4j
@Service
public class ManZheActivityImpl implements ActivityService {
@Override
public void createActivity() {
log.info("----創(chuàng)建滿折活動----");
}
@Override
public ActivityTypeEnum type() {
return ActivityTypeEnum.MANZHE;
}
}- 預售實現(xiàn)類:
/**
* @author gf
* @date 2023/2/7
*/
@Slf4j
@Service
public class PreSaleActivityImpl implements ActivityService {
@Override
public void createActivity() {
log.info("----創(chuàng)建預售活動----");
}
@Override
public ActivityTypeEnum type() {
return ActivityTypeEnum.PRESALE;
}
}- 創(chuàng)建活動創(chuàng)建通用接口
/**
* @author gf
* @date 2023/2/7
*/
@RestController
public class ActivityController {
@Autowired
private List<ActivityService> activityService;
/**
* 創(chuàng)建活動
*
* @param type 活動類型
* @return
*/
public void createActivity(int type) {
/**
* 根據(jù)動類型,找到對應的處理器
*/
Optional<ActivityService> any = activityService.stream().filter(f -> f.type().getType() == type).findAny();
/**
* 沒有對應的處理器
*/
if (!any.isPresent()) {
throw new RuntimeException("沒有找到相應的活動實現(xiàn)");
}
// 創(chuàng)建訂單
any.get().createActivity();
}
}測試活動創(chuàng)建
@SpringBootTest
class DesignApplicationTests {
@Autowired
private ActivityController activityController;
@Test
void contextLoads() {
activityController.createActivity(ActivityTypeEnum.MANJIAN.getType());
}
}
搞定,看是不是很方便,省去了很多的if--else的判斷和接口的注入
三. 策略模式的優(yōu)缺點
優(yōu)點:
- 算法可以自由切換;
- 避免使用多重判斷;
- 拓展性良好,增加一個策略只需要實現(xiàn)接口即可;
缺點:
- 策略類數(shù)量會增多,每個策略都是一個類,復用性很??;
- 所有的策略類都需要對外暴露
到此這篇關(guān)于Java設(shè)計模式之策略模式解析的文章就介紹到這了,更多相關(guān)Java策略模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring在@ConditionalOnProperty注解使用詳解
這篇文章主要介紹了Spring在@ConditionalOnProperty注解使用詳解,@ConditionalOnProperty注解是Spring Boot的條件注解,主要用法是根據(jù)配置文件中的屬性來控制某個配置類是否生效,或者控制某個Bean是否被創(chuàng)建,需要的朋友可以參考下2023-11-11
Java調(diào)用Python代碼實現(xiàn)Word轉(zhuǎn)化為PDF格式
這篇文章主要為大家詳細介紹了Java如何實現(xiàn)調(diào)用Python代碼實現(xiàn)Word轉(zhuǎn)化為PDF格式,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2026-03-03
Spring的UnsatisfiedDependencyException異常的解決
在使用Spring框架開發(fā)應用程序時,我們經(jīng)常會遇到各種異常,本文主要介紹了Spring的UnsatisfiedDependencyException異常的解決,感興趣的可以了解一下2023-11-11

