亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解Java如何在業(yè)務代碼中優(yōu)雅的使用策略模式

 更新時間:2023年08月27日 10:40:48   作者:半畝方塘立身  
這篇文章主要為大家介紹了Java如何在業(yè)務代碼中優(yōu)雅的使用策略模式,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的可以了解下

策略模式介紹

假設你正在開發(fā)一個電商平臺,其中涉及到商品的折扣策略。優(yōu)惠策略有很多種可能,如領取優(yōu)惠券抵扣、返現(xiàn)促銷、拼團優(yōu)惠等。最初的實現(xiàn)可能會在購物車類中嵌入各種折扣邏輯,導致代碼的可維護性和擴展性下降。

下面代碼在業(yè)務開發(fā)中經(jīng)常遇到,代碼滿足了業(yè)務需求,客戶可根據(jù)自己的需求選擇不同的優(yōu)惠策略。但是,經(jīng)過一段時間的業(yè)務積累,促銷活動會越來越多。于是,程序員就開始經(jīng)常加班,每次上活動之前都要通宵改代碼,而且要做重復測試,判斷邏輯可能也會變得越來越復雜。此時,我們要思考代碼是否需要重構。

public static void main(String[] args) {
    PromotionActivity promotionActivity = null;
    String promotionKey = "COUPON";
    if(StringUtils.equals(promotionKey,"COUPON")){
        promotionActivity = new PromotionActivity(new CouponStrategy());
    }else if(StringUtils.equals(promotionKey,"CASHBACK")){
        promotionActivity = new PromotionActivity(new CashbackStrategy());
    }//......
    promotionActivity.execute();
}

下面我們看下策略模式如何優(yōu)雅的解決這個問題。

策略模式是一種行為型設計模式,它允許在運行時選擇算法的一種方式,使得算法可以獨立于客戶端代碼進行變化。在業(yè)務代碼中使用策略模式可以幫助你實現(xiàn)可維護、可擴展和可變化的代碼結構。下面是在業(yè)務代碼中使用策略模式的一般步驟:

  • 定義策略接口: 首先,定義一個策略接口,其中聲明了策略的方法或行為。這些方法將在不同的具體策略類中實現(xiàn)。
  • 創(chuàng)建具體策略類: 創(chuàng)建實現(xiàn)策略接口的具體策略類,每個類實現(xiàn)了策略接口中的方法。每個具體策略類代表了一個算法或行為的具體實現(xiàn)。
  • 在客戶端代碼中使用策略: 在客戶端代碼中,通過持有策略接口類型的引用,可以在運行時選擇不同的策略實現(xiàn)。這樣客戶端代碼可以根據(jù)需要切換或替換不同的策略。

業(yè)務代碼中如何使用

現(xiàn)在后端項目基本都是基于 Spring Boot 開發(fā)的,我們基于 Spring Boot 作為基礎框架,教你如何使用 Spring 依賴注入的特性,優(yōu)雅的實現(xiàn)策略模式。

既然是策略模式,那么定義策略肯定是首當其沖,策略我們使用枚舉實現(xiàn)最佳

public enum StrategyType {
? ? STRATEGY_A(1, "策略A"),
? ? STRATEGY_B(2, "策略B");
? ? private int code;
? ? private String desc;
? ? StrategyType(int code, String desc) {
? ? ? ? this.code = code;
? ? ? ? this.desc = desc;
? ? }
? ? public int getCode() {
? ? ? ? return code;
? ? }
? ? public String getDesc() {
? ? ? ? return desc;
? ? }
}

再定義一個接口,接口有兩個方法,getType用來獲取策略的業(yè)務類型,execute用來執(zhí)行業(yè)務

public interface Strategy {
? ? void execute();
? ? StrategyType getType();
}

這里我們實現(xiàn)個策略StrategyA

@Component("strategyA")
public class StrategyA implements Strategy {
? ? @Override
? ? public void execute() {
? ? ? ? System.out.println("Executing strategy A");
? ? }
? ? @Override
? ? public StrategyType getType() {
? ? ? ? return StrategyType.STRATEGY_A;
? ? }
}

再實現(xiàn)個策略StrategyB

@Component("strategyB")
public class StrategyB implements Strategy {
? ? @Override
? ? public void execute() {
? ? ? ? System.out.println("Executing strategy B");
? ? }
? ? @Override
? ? public StrategyType getType() {
? ? ? ? return StrategyType.STRATEGY_B;
? ? }
}

我們通過定義一個工廠類,然后使用 Spring 的依賴注入特性,可以注入一個接口的多個實現(xiàn),這里采用 List<Strategy> 的形式注入,Spring 也支持通過 Map<String,Strategy> 的形式注入,如果使用 Map 注入,那么 key 就是類名,小伙伴們自己也可以測試一下~

為方便調用我們需要將List<Strategy>轉換成Map<StrategyType, Strategy>結構,業(yè)務執(zhí)行時可以直接傳遞業(yè)務參數(shù)(這里是我們定義的一個業(yè)務枚舉StrategyType)獲取Bean。這里我們直接使用Spring@PostConstruct注解在方法上,表示此方法是在Spring實例化該Bean之后馬上執(zhí)行此方法。

@Service
public class StrategyFactory {
? ? private Map<StrategyType, Strategy> strategyMap = new ConcurrentHashMap<>();
? ? @Resource
? ? private List<Strategy> strategyList;
? ? public void execute(StrategyType type) {
? ? ? ? strategyMap.get(type).execute();
? ? }
? ? @PostConstruct
? ? public void init() {
? ? ? ? for (Strategy strategy : strategyList) {
? ? ? ? ? ? strategyMap.put(strategy.getType(), strategy);
? ? ? ? }
? ? }
}

最后我們在業(yè)務類StrategyService直接使用就行了。

@Service
public class StrategyService {
? ? @Resource
? ? private StrategyFactory strategyFactory;
? ? public void executeStrategy(StrategyType type) {
? ? ? ? strategyFactory.execute(type);
? ? }
}

最終結構如下所示:

總結

使用 Spring 的依賴注入特性,可以注入一個接口的多個實現(xiàn),很容易就實現(xiàn)了策略模式的選擇,這樣后續(xù)添加一種策略的時候,完全不需要改動主要邏輯,只需添加具體實現(xiàn)即可。

雖然我們是講策略模式,其實里面還包含了工廠模式。

到此這篇關于詳解Java如何在業(yè)務代碼中優(yōu)雅的使用策略模式的文章就介紹到這了,更多相關Java策略模式內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • java中HashMap的七種遍歷方式小結

    java中HashMap的七種遍歷方式小結

    本文主要介紹了java中HashMap的七種遍歷方式小結,包括迭代器,For Each,Lambda,Streams API等,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • Mybatis之類型處理器TypeHandler的作用與自定義方式

    Mybatis之類型處理器TypeHandler的作用與自定義方式

    這篇文章主要介紹了Mybatis之類型處理器TypeHandler的作用與自定義方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Spring源碼閱讀MethodInterceptor解析

    Spring源碼閱讀MethodInterceptor解析

    這篇文章主要為大家介紹了Spring源碼閱讀MethodInterceptor使用示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • 關于springboot中對sqlSessionFactoryBean的自定義

    關于springboot中對sqlSessionFactoryBean的自定義

    這篇文章主要介紹了springboot中對sqlSessionFactoryBean的自定義方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • SpringBoot多環(huán)境配置及配置文件分類實例詳解

    SpringBoot多環(huán)境配置及配置文件分類實例詳解

    這篇文章主要介紹了SpringBoot多環(huán)境配置及配置文件分類,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-10-10
  • SpringMVC 上傳文件 MultipartFile 轉為 File的方法

    SpringMVC 上傳文件 MultipartFile 轉為 File的方法

    這篇文章主要介紹了SpringMVC 上傳文件 MultipartFile 轉為 File的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • IDEA導入eclipse項目并且部署到tomcat的步驟詳解

    IDEA導入eclipse項目并且部署到tomcat的步驟詳解

    這篇文章主要給大家介紹了關于IDEA導入eclipse項目并且部署到tomcat的相關資料,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-02-02
  • 使用mybatis框架連接mysql數(shù)據(jù)庫的超詳細步驟

    使用mybatis框架連接mysql數(shù)據(jù)庫的超詳細步驟

    MyBatis是目前java項目連接數(shù)據(jù)庫的最流行的orm框架了,下面這篇文章主要給大家介紹了關于使用mybatis框架連接mysql數(shù)據(jù)庫的超詳細步驟,文中通過實例代碼和圖文介紹的非常詳細,需要的朋友可以參考下
    2023-04-04
  • Spring核心思想之淺談IoC容器與依賴倒置(DI)

    Spring核心思想之淺談IoC容器與依賴倒置(DI)

    文章介紹了Spring的IoC和DI機制,以及MyBatis的動態(tài)代理,通過注解和反射,Spring能夠自動管理對象的創(chuàng)建和依賴注入,而MyBatis則通過動態(tài)代理實現(xiàn)了接口方法到數(shù)據(jù)庫操作的映射,文章詳細解釋了Spring和MyBatis的工作原理,并通過示例代碼展示了它們的結合使用方式
    2025-01-01
  • Java日期時間處理問題(從Date、Calendar到SimpleDateFormat)

    Java日期時間處理問題(從Date、Calendar到SimpleDateFormat)

    這篇文章主要介紹了Java日期時間處理深度解析(從Date、Calendar到SimpleDateFormat),我們詳細討論了Java中的日期和時間處理,包括Date、Calendar和SimpleDateFormat類的使用,以及Java?8引入的新的日期時間API的優(yōu)勢,需要的朋友可以參考下
    2024-08-08

最新評論