最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

策略模式介紹

假設(shè)你正在開(kāi)發(fā)一個(gè)電商平臺(tái),其中涉及到商品的折扣策略。優(yōu)惠策略有很多種可能,如領(lǐng)取優(yōu)惠券抵扣、返現(xiàn)促銷(xiāo)、拼團(tuán)優(yōu)惠等。最初的實(shí)現(xiàn)可能會(huì)在購(gòu)物車(chē)類(lèi)中嵌入各種折扣邏輯,導(dǎo)致代碼的可維護(hù)性和擴(kuò)展性下降。

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

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)雅的解決這個(gè)問(wèn)題。

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

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

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

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

既然是策略模式,那么定義策略肯定是首當(dāng)其沖,策略我們使用枚舉實(shí)現(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;
? ? }
}

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

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

這里我們實(shí)現(xiàn)個(gè)策略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;
? ? }
}

再實(shí)現(xiàn)個(gè)策略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;
? ? }
}

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

為方便調(diào)用我們需要將List<Strategy>轉(zhuǎn)換成Map<StrategyType, Strategy>結(jié)構(gòu),業(yè)務(wù)執(zhí)行時(shí)可以直接傳遞業(yè)務(wù)參數(shù)(這里是我們定義的一個(gè)業(yè)務(wù)枚舉StrategyType)獲取Bean。這里我們直接使用Spring@PostConstruct注解在方法上,表示此方法是在Spring實(shí)例化該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);
? ? ? ? }
? ? }
}

最后我們?cè)跇I(yè)務(wù)類(lèi)StrategyService直接使用就行了。

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

最終結(jié)構(gòu)如下所示:

總結(jié)

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

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

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

相關(guān)文章

  • 實(shí)例詳解java Struts2的配置與簡(jiǎn)單案例

    實(shí)例詳解java Struts2的配置與簡(jiǎn)單案例

    這篇文章主要介紹了java Struts2的配置與簡(jiǎn)單案例,需要的朋友可以參考下
    2017-04-04
  • Spring security自定義用戶認(rèn)證流程詳解

    Spring security自定義用戶認(rèn)證流程詳解

    這篇文章主要介紹了Spring security自定義用戶認(rèn)證流程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Jenkins環(huán)境搭建之下載與安裝過(guò)程

    Jenkins環(huán)境搭建之下載與安裝過(guò)程

    Jenkins是一個(gè)功能強(qiáng)大的應(yīng)用程序,允許持續(xù)集成和持續(xù)交付項(xiàng)目,集成Jenkins可以用于一些測(cè)試和部署技術(shù),對(duì)Jenkins環(huán)境搭建之下載與安裝過(guò)程感興趣的朋友跟隨小編一起看看吧
    2021-12-12
  • IDEA下Maven的pom文件導(dǎo)入依賴(lài)出現(xiàn)Auto build completed with errors的問(wèn)題

    IDEA下Maven的pom文件導(dǎo)入依賴(lài)出現(xiàn)Auto build completed with errors的問(wèn)題

    這篇文章主要介紹了IDEA下Maven的pom文件導(dǎo)入依賴(lài)出現(xiàn)Auto build completed with errors,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Spring Boot 常用注解整理(最全收藏版)

    Spring Boot 常用注解整理(最全收藏版)

    本文系統(tǒng)整理了常用的 Spring/Spring Boot 注解,按照功能分類(lèi)進(jìn)行介紹,每個(gè)注解都會(huì)涵蓋其含義、提供來(lái)源、應(yīng)用場(chǎng)景以及代碼示例,幫助開(kāi)發(fā)者深入理解和快速檢索,感興趣的朋友跟隨小編一起看看吧
    2025-05-05
  • gitlab-runner結(jié)合docker部署項(xiàng)目全過(guò)程

    gitlab-runner結(jié)合docker部署項(xiàng)目全過(guò)程

    本文介紹了使用GitLab和GitLab Runner自動(dòng)化構(gòu)建Spring Boot項(xiàng)目的方法,搭建好GitLab和GitLab Runner后,在Spring Boot項(xiàng)目中創(chuàng)建.gitlab-ci.yml文件,配置腳本準(zhǔn)備Maven編譯項(xiàng)目、打包JAR包及運(yùn)行JAR包,并在設(shè)置中配置CI/CD,這樣,點(diǎn)擊項(xiàng)目CI/CD即可自動(dòng)化運(yùn)行
    2026-05-05
  • Java中清空集合列表元素的四種方法

    Java中清空集合列表元素的四種方法

    Java清空列表有多種方式,包括clear()高效直接、創(chuàng)建新列表需注意引用、removeAll需傳入集合、循環(huán)移除效率低,下面就來(lái)介紹一下如何實(shí)現(xiàn),感興趣的可以了解一下
    2025-07-07
  • Netty分布式NioEventLoop優(yōu)化selector源碼解析

    Netty分布式NioEventLoop優(yōu)化selector源碼解析

    這篇文章主要介紹了Netty分布式NioEventLoop優(yōu)化selector源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • Apache Commons fileUpload實(shí)現(xiàn)文件上傳之一

    Apache Commons fileUpload實(shí)現(xiàn)文件上傳之一

    這篇文章主要介紹了Apache Commons fileUpload實(shí)現(xiàn)文件上傳之一的相關(guān)資料,需要的朋友可以參考下
    2016-03-03
  • Java實(shí)現(xiàn)歸并排序的方法詳解(包含遞歸+非遞歸)

    Java實(shí)現(xiàn)歸并排序的方法詳解(包含遞歸+非遞歸)

    歸并歸分n時(shí)間復(fù)雜度O(nlogn)的歸并排序,遞歸與迭代實(shí)現(xiàn),穩(wěn)定排序適用于大數(shù)據(jù)處理,本文詳細(xì)解析了遞歸與非遞歸版本的實(shí)現(xiàn)邏輯與應(yīng)用場(chǎng)景,需要的朋友可以參考下
    2026-05-05

最新評(píng)論

阳信县| 沙坪坝区| 米林县| 长沙市| 宜州市| 琼中| 子长县| 阿坝| 绥江县| 商河县| 澄城县| 白水县| 鹤庆县| 康马县| 阳东县| 许昌县| 商丘市| 庐江县| 光泽县| 习水县| 景德镇市| 洮南市| 平陆县| 丹巴县| 巫溪县| 九江市| 伊金霍洛旗| 井冈山市| 读书| 海安县| 岐山县| 三明市| 凭祥市| 卓尼县| 会昌县| 西乌| 景洪市| 长治市| 沂源县| 米脂县| 呼图壁县|