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

Spring?boot?運(yùn)用策略模式實(shí)現(xiàn)避免多次使用if

 更新時(shí)間:2022年09月25日 10:57:10   作者:我贏了算我輸???????  
這篇文章主要介紹了Spring?boot?運(yùn)用策略模式實(shí)現(xiàn)避免多次使用if,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下

前言

這里就不詳細(xì)去介紹策略模式是怎么樣的了,想了解的可以點(diǎn)擊下面的鏈接

策略模式介紹的鏈接:Java 設(shè)計(jì)模式中的策略模式詳情

這里列出策略模式的好處

場景:某網(wǎng)頁有個(gè)支付,其中包含了微信、支付寶等方式的支付方式 ,后續(xù)明確還會(huì)進(jìn)行兼容其他的支付方式

用策略模式的好處:

  • 避免多次使用if判斷具體是用哪種支付策略進(jìn)行操作。
  • 因?yàn)槊糠N策略(微信支付、支付寶支付)的內(nèi)容都比較復(fù)雜。策略模式能將每種策略分離出來,方面后續(xù)維護(hù)管理

下面我們將使用Spring boot 運(yùn)用策略模式,實(shí)現(xiàn)上面的需求

環(huán)境配置

  • JDK8
  • Spring boot 2.3.7.RELEASE
  • 整合了spring-boot-starter-web

實(shí)現(xiàn)目標(biāo)

使用策略模式后,新加一種支付策略時(shí),只需要在策略枚舉中添加新加的策略信息,外加一個(gè)策略類即可,而不再需要添加新的if判斷。

準(zhǔn)備策略接口和具體實(shí)現(xiàn)策略類

支付策略接口

/**
 * 支付策略
 */
public interface PayStrategy {

    /**
     * 支付(參數(shù)就沒具體寫了,可以定義成每個(gè)支付必須要有的參數(shù))
     * @return
     */
     boolean pay();
}

微信支付策略類

/**
 * 第三方——微信支付(這里注意我修改了Bean的默認(rèn)命名)

 
 */
@Component("wechatPayStrategy")
public class WeChatPayStrategyImpl implements PayStrategy{

    /**
     * 支付
     * @return
     */
    @Override
    public boolean pay() {

        //進(jìn)行微信的支付邏輯
        System.out.println("正在進(jìn)行微信的支付邏輯");

        return true;
    }
}

支付寶支付策略類

/**
 * 支付寶第三方支付(這里注意我修改了Bean的默認(rèn)命名)
 */
@Component("alipayStrategy")
public class AliPayStrategyImpl implements PayStrategy {

    /**
     * 支付寶支付
     * @return
     */
    @Override
    public boolean pay() {

        //進(jìn)行支付寶支付邏輯
        System.out.println("進(jìn)行支付寶支付邏輯");
        return true;
    }
}

上述已將各自的策略的處理類進(jìn)行了分離,接下來時(shí)使用支付策略工廠類和支付策略上下文將各自的策略類聯(lián)系起來

準(zhǔn)備支付策略上下文Context和支付策略工廠類

支付策略工廠類

package com.example.springboot_strategy.strategy.factory;

import com.example.springboot_strategy.enums.PayStrategyEnum;
import com.example.springboot_strategy.strategy.PayStrategy;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import javax.swing.plaf.synth.SynthTextAreaUI;
import java.util.Map;

/**
 * 支付策略工廠類
 */
@Component
public class PayStrategyFactory {

    /**
     * 通過Spring容器的方式注入
     */
    @Resource
    private Map<String, PayStrategy> payStrategyMap;

    /**
     * 獲取對應(yīng)支付策略類
     * @param payStrategyEnum 支付策略枚舉
     */
    public PayStrategy getPayStrategy(PayStrategyEnum payStrategyEnum){

        if(!payStrategyMap.containsKey(payStrategyEnum.getClassName())){
            System.out.println("沒有對應(yīng)的支付策略,無法進(jìn)行支付");
            return null;
        }

        return payStrategyMap.get(payStrategyEnum.getClassName());
    }
}

這里工廠類的邏輯是利用了Spring容器的處理方式,如果有多種類同時(shí)實(shí)現(xiàn)了某個(gè)接口,那么可以使用Map集合接收,Map對應(yīng)的泛型,String是Bean名稱,PayStrategy是每個(gè)具體實(shí)現(xiàn)類,這樣我們就可以使用Bean類型去指定具體的策略類了,然后建立一個(gè)支付策略枚舉去管理這些Bean名稱。同時(shí),也可以將Bean名稱與客戶端定義的類型進(jìn)行關(guān)聯(lián)。

支付策略枚舉類

/**
 * 支付策略類型
 */
public enum PayStrategyEnum {
    WECHAT_PAY("wechat","wechatPayStrategy","微信支付"),
    ALIPAY("alipay","alipayStrategy","支付寶支付")
    ;
    /**
     * 支付策略code
     */
    private String code;

    /**
     * bean名稱
     */
    private String className;

    /**
     * 信息
     */
    private String info;
    PayStrategyEnum(String code,String className,String info){
        this.code=code;
        this.className=className;
        this.info=info;
    }
    public String getCode() {
        return code;
    }
    public String getClassName() {
        return className;
    }
    public String getInfo() {
        return info;
    }
}

上面枚舉類中code代表的是客戶端定義的類型(例如我從前端接收到的支付type,這個(gè)type可以是這個(gè)code),className顧名思義,指的是每種策略的bean名稱,info是代表每種策略的內(nèi)容

支付策略上下文

/**
 * 支付策略上下文
 */
@Component
public class PayStrategyContext {
    
    @Autowired
    private PayStrategyFactory payStrategyFactory;

    /**
     * 支付執(zhí)行
     * @param payDTO 支付參數(shù)
     * @return
     */
    public boolean payHandle(PayDTO payDTO){
       
        //將某屬性的值轉(zhuǎn)換成具體的枚舉。這里是根據(jù)payDTO的type字段對應(yīng)枚舉的code進(jìn)行轉(zhuǎn)換
        Optional<PayStrategyEnum> payStrategyEnumOptional = Arrays.stream(PayStrategyEnum.class.getEnumConstants())
                .filter((e) -> e.getCode().equals(payDTO.getType())).findAny();

        if(!payStrategyEnumOptional.isPresent()){
            System.out.println("匹配不到具體支付策略");
            return false;
        }
        PayStrategyEnum payStrategyEnum = payStrategyEnumOptional.get();

        PayStrategy payStrategy = payStrategyFactory.getPayStrategy(payStrategyEnum);

        //進(jìn)行payDto參數(shù)的處理.....

        boolean pay = payStrategy.pay();

        //支付后的記錄處理..


        return true;
        
    }
}

pageDto類

/**
 * 支付DTO
 */
public class PayDTO {

    /**
     * 支付類型
     */
    private String type;

    /**
     * 支付金額
     */
    private BigDecimal payMoney;
    
    /**
     * ...........
     */

    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
    public BigDecimal getPayMoney() {
        return payMoney;
    }
    public void setPayMoney(BigDecimal payMoney) {
        this.payMoney = payMoney;
    }

}

這個(gè)策略上下文,則是選擇策略的入口,這里會(huì)進(jìn)行參數(shù)的處理,將這里我就將pageDTO類中的type字符串轉(zhuǎn)換成對應(yīng)的枚舉類。
到這里使用策略模式的編寫算是完成了,下面進(jìn)行編寫客戶端的代碼

客戶端代碼

支付控制器

@RestController
@RequestMapping("pay")
public class PayController {

    @Autowired
    private PayStrategyContext payStrategyContext;
    @PostMapping
    public boolean pay(@RequestBody PayDTO payDTO){

        //這里因?yàn)閼?。。就沒有加上Service層了,直接在控制器處理
        return payStrategyContext.payHandle(payDTO);
    }
}

效果

新需求

后續(xù)新增一個(gè)銀聯(lián)的支付方式,我們只需要添加銀聯(lián)的支付策略類和添加銀聯(lián)的支付枚舉即可實(shí)現(xiàn)

添加銀聯(lián)的支付策略類

/**
 * 銀聯(lián)支付(這里注意我修改了Bean的默認(rèn)命名)
 */
@Component("unionPayStrategy")
public class UnionPayStrategyImp implements PayStrategy {


    /**
     * 銀聯(lián)支付
     * @return
     */
    @Override
    public boolean pay() {

        //進(jìn)行銀聯(lián)的支付

        System.out.println("進(jìn)行銀聯(lián)的支付邏輯");
        return true;
    }

}

在枚舉類中添加銀聯(lián)的支付枚舉

/**
 * 支付策略類型
 */
public enum PayStrategyEnum {
    WECHAT_PAY("wechat","wechatPayStrategy","微信支付"),
    ALIPAY("alipay","alipayStrategy","支付寶支付"),
    UNION_PAY("unionpay","unionPayStrategy","銀聯(lián)支付")
    ;

    /**
     * 支付策略code
     */
    private String code;

    /**
     * bean名稱
     */
    private String className;

    /**
     * 信息
     */
    private String info;

    PayStrategyEnum(String code,String className,String info){
        this.code=code;
        this.className=className;
        this.info=info;
    }


    public String getCode() {
        return code;
    }

    public String getClassName() {
        return className;
    }

    public String getInfo() {
        return info;
    }


}
復(fù)制代碼

實(shí)現(xiàn)效果

到此這篇關(guān)于Spring boot 運(yùn)用策略模式實(shí)現(xiàn)避免多次使用if的文章就介紹到這了,更多相關(guān)Spring boot 避免多次使用if內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot整合Swagger3生成接口文檔過程解析

    SpringBoot整合Swagger3生成接口文檔過程解析

    這篇文章主要介紹了SpringBoot整合Swagger3生成接口文檔過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Spring Boot 連接LDAP的方法

    Spring Boot 連接LDAP的方法

    這篇文章主要介紹了Spring Boot 連接LDAP的方法,僅僅涉及基本的使用ODM來快速實(shí)現(xiàn)LDAP增刪改查操作。具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-12-12
  • Mybatis Generator逆向工程的使用詳細(xì)教程

    Mybatis Generator逆向工程的使用詳細(xì)教程

    這篇文章主要介紹了Mybatis Generator逆向工程的使用詳細(xì)教程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Spring創(chuàng)建Bean的過程Debug的詳細(xì)流程

    Spring創(chuàng)建Bean的過程Debug的詳細(xì)流程

    這篇文章主要介紹了Spring創(chuàng)建Bean的過程Debug的流程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • MyBatis-Plus框架整合詳細(xì)方法

    MyBatis-Plus框架整合詳細(xì)方法

    MyBatis-Plus是一個(gè) MyBatis 的增強(qiáng)工具,在 MyBatis 的基礎(chǔ)上只做增強(qiáng)不做改變,為簡化開發(fā)、提高效率而生這篇文章主要介紹了MyBatis-Plus框架整合,需要的朋友可以參考下
    2022-04-04
  • jvm中指定時(shí)區(qū)信息user.timezone問題及解決方式

    jvm中指定時(shí)區(qū)信息user.timezone問題及解決方式

    同一份程序使用時(shí)間LocalDateTime類型,在國內(nèi)和國外部署后,返回的時(shí)間信息前端使用出問題,這篇文章主要介紹了jvm中指定時(shí)區(qū)信息user.timezone問題及解決方法,需要的朋友可以參考下
    2023-02-02
  • java學(xué)習(xí)之junit單元測試案例(經(jīng)典版)

    java學(xué)習(xí)之junit單元測試案例(經(jīng)典版)

    這篇文章主要介紹了java學(xué)習(xí)之junit單元測試的相關(guān)資料,文中講解了JUnit單元測試的基本概念、作用、使用assert進(jìn)行驗(yàn)證、覆蓋率分析、BeforeEach和AfterAll的使用、通過反射和注解實(shí)現(xiàn)測試,需要的朋友可以參考下
    2024-12-12
  • 詳解eclipse創(chuàng)建maven項(xiàng)目實(shí)現(xiàn)動(dòng)態(tài)web工程完整示例

    詳解eclipse創(chuàng)建maven項(xiàng)目實(shí)現(xiàn)動(dòng)態(tài)web工程完整示例

    這篇文章主要介紹了詳解eclipse創(chuàng)建maven項(xiàng)目實(shí)現(xiàn)動(dòng)態(tài)web工程完整示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-12-12
  • Spring Boot+Shiro實(shí)現(xiàn)一個(gè)Http請求的Basic認(rèn)證

    Spring Boot+Shiro實(shí)現(xiàn)一個(gè)Http請求的Basic認(rèn)證

    本文向向大家仔細(xì)的介紹了如何使用Shiro實(shí)現(xiàn)一個(gè)Http請求的Basic認(rèn)證,有此需求的朋友可以參考下本文
    2021-06-06
  • SpringCloud實(shí)戰(zhàn)之Feign聲明式服務(wù)調(diào)用

    SpringCloud實(shí)戰(zhàn)之Feign聲明式服務(wù)調(diào)用

    這篇文章主要介紹了SpringCloud實(shí)戰(zhàn)之Feign聲明式服務(wù)調(diào)用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-05-05

最新評論

贵定县| 海阳市| 梁山县| 油尖旺区| 平泉县| 辉县市| 宣城市| 息烽县| 阿合奇县| 达尔| 工布江达县| 兖州市| 旬邑县| 平罗县| 南召县| 容城县| 酉阳| 通河县| 越西县| 安阳县| 长葛市| 利津县| 云林县| 涡阳县| 星座| 达拉特旗| 南部县| 方正县| 务川| 老河口市| 台南市| 漳平市| 齐河县| 锡林郭勒盟| 西华县| 牟定县| 牙克石市| 汨罗市| 白玉县| 英吉沙县| 上犹县|