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

java?設(shè)計(jì)模式從風(fēng)控鏈理解責(zé)任鏈模式

 更新時(shí)間:2023年05月18日 11:18:04   作者:不一樣的科技宅  
這篇文章主要為大家介紹了java?設(shè)計(jì)模式從風(fēng)控鏈理解責(zé)任鏈模式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

  責(zé)任鏈?zhǔn)且环N行為型模式。顧名思義,由多個(gè)有不同處理能力節(jié)點(diǎn)組成的一條執(zhí)行鏈。當(dāng)一個(gè)事件進(jìn)來時(shí),會(huì)判斷當(dāng)前節(jié)點(diǎn)是否有處理的能力,反之轉(zhuǎn)入下一個(gè)節(jié)點(diǎn)進(jìn)行處理。可以從支付的風(fēng)控鏈這個(gè)場景,深入的理解責(zé)任鏈模式。

定義

  責(zé)任鏈模式:包含了一些命令和一系列的處理對象。每一個(gè)處理對象決定了它能處理哪些命令對象,它也知道如何將它不能處理的命令對象傳遞給該鏈中的下一個(gè)處理對象。

如何理解

  信用卡套現(xiàn),花唄套現(xiàn),白條套現(xiàn),類似的名詞對于我們來講應(yīng)該不陌生吧。在支付系統(tǒng)中會(huì)有一套風(fēng)控系統(tǒng),來避免發(fā)生類似的事情出現(xiàn)。而風(fēng)控系統(tǒng)就是責(zé)任鏈模式的一種應(yīng)用。

比如說給xxx商戶配置的風(fēng)控規(guī)則是:

TOP信用卡花唄白條
木屋燒烤500/日300/日300/日

  當(dāng)用戶向商家付款時(shí),會(huì)根據(jù)不同的支付方式,來判斷是否觸發(fā)風(fēng)控條件。如果達(dá)到觸發(fā)條件則不允許使用該方式支付。來避免發(fā)生信用卡套現(xiàn)類似的事情。

我們寫個(gè)簡單的風(fēng)控程序來理解一下:

UML

代碼示例

RiskHandler

public abstract class RiskHandler {
    /**
     * 支付方式
     */
    private String payType;
    private RiskHandler nextHandler;
    public RiskHandler(String payType) {
        this.payType = payType;
    }
    /**
     * 是否能支付
     * @param order 訂單
     */
    protected abstract boolean canPay(Order order);
    /**
     * 處理器
     * @param order 訂單
     * @return 返回true 或者 false
     */
    public final boolean handler(Order order){
        if(order.getPayType().equals(this.payType)){
            return this.canPay(order);
        }else {
            if (this.nextHandler != null){
                return this.nextHandler.handler(order);
            }else{
                throw new IllegalArgumentException("支付方式有誤");
            }
        }
    }
    public void setNextHandler(RiskHandler handler){
        this.nextHandler = handler;
    }
}

CreditHandler

public class CreditHandler extends RiskHandler {
    /**
     * 500 限額
     */
    private BigDecimal limitAmount = BigDecimal.valueOf(500);
    public CreditHandler() {
        super(PayTypeEnum.CREDIT.getPayType());
    }
    @Override
    protected boolean canPay(Order order) {
        if(order.getAmount().compareTo(limitAmount) < 0){
            limitAmount = limitAmount.subtract(order.getAmount());
            return true;
        }else {
            return false;
        }
    }
}

HuabeiHandler

public class HuabeiHandler extends RiskHandler {
    /**
     * 300 限額
     */
    private BigDecimal limitAmount = BigDecimal.valueOf(300);
    public HuabeiHandler() {
        super(PayTypeEnum.HUA_BEI.getPayType());
    }
    @Override
    protected boolean canPay(Order order) {
        if(order.getAmount().compareTo(limitAmount) < 0){
            limitAmount = limitAmount.subtract(order.getAmount());
            return true;
        }else {
            return false;
        }
    }
}

BaiTiaoHandler

public class BaiTiaoHandler extends RiskHandler {
    /**
     * 300 限額
     */
    private BigDecimal limitAmount = BigDecimal.valueOf(300);
    public BaiTiaoHandler() {
        super(PayTypeEnum.BAI_TIAO.getPayType());
    }
    @Override
    protected boolean canPay(Order order) {
        if(order.getAmount().compareTo(limitAmount) &lt; 0){
            limitAmount = limitAmount.subtract(order.getAmount());
            return true;
        }else {
            return false;
        }
    }
}

Order

public interface Order {
    /**
     * 獲取支付方式
     * @return 支付方式
     */
    String getPayType();
    /**
     * 獲取訂單金額
     * @return 訂單金額
     */
    BigDecimal getAmount();
}

ConsumeOrder

public class ConsumeOrder implements Order {
    private String payType;
    private BigDecimal amount;
    public ConsumeOrder(String payType, BigDecimal amount) {
        this.payType = payType;
        this.amount = amount;
    }
    @Override
    public String getPayType() {
        return this.payType;
    }
    @Override
    public BigDecimal getAmount() {
        return this.amount;
    }
}

PayTypeEnum

public enum  PayTypeEnum {
    /**
     * 花唄
     */
    HUA_BEI("hua_bei"),
    /**
     * 白條
     */
    BAI_TIAO("bai_tiao"),
    /**
     * 信用卡
     */
    CREDIT("credit"),
    ;
    private String payType;
    PayTypeEnum(String payType) {
        this.payType = payType;
    }
    public String getPayType() {
        return payType;
    }
}

PayRiskControlService

public class PayRiskControlService {
    public boolean canPay(Order order){
        // 設(shè)置風(fēng)控
        RiskHandler creditHandler = new CreditHandler();
        RiskHandler huabeiHandler = new HuabeiHandler();
        RiskHandler baiTiaoHandler = new BaiTiaoHandler();
        creditHandler.setNextHandler(huabeiHandler);
        huabeiHandler.setNextHandler(baiTiaoHandler);
        return creditHandler.handler(order);
    }
}

Test

public class Test {
    public static void main(String[] args) {
        // 花唄訂單
        ConsumeOrder huabeiOrder = new ConsumeOrder(
                PayTypeEnum.HUA_BEI.getPayType(), BigDecimal.valueOf(200)
        );
        // 白條訂單
        ConsumeOrder baitiaoOrder = new ConsumeOrder(
                PayTypeEnum.BAI_TIAO.getPayType(), BigDecimal.valueOf(301)
        );
        // 加載風(fēng)控系統(tǒng)
        PayRiskControlService riskControlService = new PayRiskControlService();
        // 創(chuàng)建訂單
        boolean canPayOfHuabei = riskControlService.canPay(huabeiOrder);
        boolean canPayOfBaitiao = riskControlService.canPay(baitiaoOrder);
        System.out.println("canPayOfHuabei = " + canPayOfHuabei);
        System.out.println("canPayOfBaitiao = " + canPayOfBaitiao);
    }
}

測試結(jié)果

ConsumeOrder{payType='hua_bei', amount=200} canPay: true

ConsumeOrder{payType='bai_tiao', amount=301} canPay: false

優(yōu)點(diǎn)

  • 降低耦合度,將請求和處理分開。
  • 簡化了對象,是對象不需要知道鏈的結(jié)構(gòu)。
  • 增強(qiáng)給對象指派職責(zé)的靈活性,通過改變鏈內(nèi)的成員或者調(diào)動(dòng)他們的次序,運(yùn)行動(dòng)態(tài)的新增或者刪除責(zé)任。
  • 增加新的處理類很方便。

缺點(diǎn)

  • 不能保證請求一定被接收
  • 系統(tǒng)性能將受到一定影響,而且在調(diào)試代碼時(shí)不太方便,可能會(huì)造成循環(huán)調(diào)用。
  • 可能不容易觀察運(yùn)行時(shí)的特征,有礙于除錯(cuò)。

應(yīng)用場景

  • 有多個(gè)對象可以處理同一個(gè)請求,具體是哪個(gè)對象處理由該請求運(yùn)行時(shí)刻自動(dòng)確定。
  • 在不明確接受者的情況下,向多個(gè)對象中的一個(gè)提交一個(gè)請求。
  • 可以動(dòng)態(tài)指定一組對象處理請求。

責(zé)任鏈模式的兩種情況

純的職責(zé)鏈模式

  一個(gè)請求必須被某一個(gè)處理者對象所接收,且一個(gè)具體處理者對某個(gè)請求的處理只能采用以下兩種行為之一:自己處理(承擔(dān)責(zé)任),把責(zé)任推給下家處理。

不純的職責(zé)鏈模式

  允許出現(xiàn)某一個(gè)具體處理者對象在承擔(dān)了請求的一部分責(zé)任后又將剩余的責(zé)任傳給下家的情況,且一個(gè)請求可以最終不被任何接收端對象所接收。比如說,多級審核,登錄安全監(jiān)測

注意的點(diǎn)

  鏈中節(jié)點(diǎn)數(shù)量需要控制,避免出現(xiàn)超長鏈的情況,一般的做法是在Handler中設(shè)置一個(gè)最大節(jié)點(diǎn)數(shù)量,在setNext方法中判斷是否已經(jīng)是超過其閾值,超過則不允許該鏈建立,避免無意識地破壞系統(tǒng)性能。

參考文章

以上就是java 設(shè)計(jì)模式從風(fēng)控鏈理解責(zé)任鏈模式的詳細(xì)內(nèi)容,更多關(guān)于java責(zé)任鏈模式的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Spring核心容器IOC原理實(shí)例解析

    Spring核心容器IOC原理實(shí)例解析

    這篇文章主要介紹了Spring核心容器IOC原理實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Java使用dom4j解析xml、讀取xml文件圖文教程

    Java使用dom4j解析xml、讀取xml文件圖文教程

    這篇文章主要給大家介紹了關(guān)于Java使用dom4j解析xml、讀取xml文件的相關(guān)資料,包括創(chuàng)建SAXReader對象、讀取并解析XML文件、獲取Document對象、獲取根元素和子元素、獲取屬性和內(nèi)容等操作,還提供了配置Dom4j?jar包的步驟,需要的朋友可以參考下
    2025-02-02
  • SpringMVC框架和SpringBoot項(xiàng)目中控制器的響應(yīng)結(jié)果深入分析

    SpringMVC框架和SpringBoot項(xiàng)目中控制器的響應(yīng)結(jié)果深入分析

    這篇文章主要介紹了SpringMVC框架和SpringBoot項(xiàng)目中控制器的響應(yīng)結(jié)果,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-12-12
  • Spring Boot通過Junit實(shí)現(xiàn)單元測試過程解析

    Spring Boot通過Junit實(shí)現(xiàn)單元測試過程解析

    這篇文章主要介紹了Spring Boot通過Junit實(shí)現(xiàn)單元測試過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Java中線程間通信流程詳解

    Java中線程間通信流程詳解

    這篇文章主要介紹了Java中線程間通信流程,Java線程間通信主要通過??共享內(nèi)存或??消息傳遞??實(shí)現(xiàn)同步與數(shù)據(jù)交換,并發(fā)面試題中常會(huì)碰到這個(gè)問題,需要的朋友可以參考下
    2025-05-05
  • Java?@Scheduled定時(shí)任務(wù)不執(zhí)行解決辦法

    Java?@Scheduled定時(shí)任務(wù)不執(zhí)行解決辦法

    這篇文章主要給大家介紹了關(guān)于Java?@Scheduled定時(shí)任務(wù)不執(zhí)行解決的相關(guān)資料,當(dāng)@Scheduled定時(shí)任務(wù)不執(zhí)行時(shí)可以根據(jù)以下步驟進(jìn)行排查和解決,需要的朋友可以參考下
    2023-10-10
  • Java中ASCII到十六進(jìn)制的轉(zhuǎn)換指南

    Java中ASCII到十六進(jìn)制的轉(zhuǎn)換指南

    在軟件開發(fā)、網(wǎng)絡(luò)通信與底層系統(tǒng)交互中,ASCII 字符與十六進(jìn)制表示之間的轉(zhuǎn)換是一項(xiàng)基礎(chǔ)且高頻的操作,本文將從計(jì)算機(jī)編碼的底層邏輯出發(fā),結(jié)合 Java 平臺的特性,系統(tǒng)探討 ASCII 轉(zhuǎn)十六進(jìn)制的核心機(jī)制、應(yīng)用場景、設(shè)計(jì)考量與最佳實(shí)踐,需要的朋友可以參考下
    2026-05-05
  • java遍歷途中修改數(shù)據(jù)及刪除數(shù)據(jù)的方法總結(jié)

    java遍歷途中修改數(shù)據(jù)及刪除數(shù)據(jù)的方法總結(jié)

    在使用java的集合類遍歷數(shù)據(jù)的時(shí)候,在某些情況下可能需要對某些數(shù)據(jù)進(jìn)行刪除,下面這篇文章主要給大家介紹了關(guān)于java遍歷途中修改數(shù)據(jù)及刪除數(shù)據(jù)的方法總結(jié),需要的朋友可以參考下
    2023-10-10
  • spring boot中的properties參數(shù)配置詳解

    spring boot中的properties參數(shù)配置詳解

    這篇文章主要介紹了spring boot中的properties參數(shù)配置,需要的朋友可以參考下
    2017-09-09
  • java.time包時(shí)間類的具體使用

    java.time包時(shí)間類的具體使用

    本文主要介紹了java.time包時(shí)間類的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08

最新評論

清水县| 蓬溪县| 泽库县| 娱乐| 丰城市| 孟连| 双流县| 石家庄市| 湖南省| 观塘区| 横峰县| 宁陕县| 双辽市| 宜宾市| 长岭县| 泰和县| 汕尾市| 佛坪县| 应用必备| 建瓯市| 三门峡市| 时尚| 巨鹿县| 介休市| 寿阳县| 金坛市| 无锡市| 瓦房店市| 无棣县| 南阳市| 汝南县| 黄山市| 锡林浩特市| 巴塘县| 钦州市| 阳新县| 清流县| 许昌市| 长乐市| 滦平县| 花莲市|