Spring Boot 項目基于責任鏈模式實現復雜接口的解耦和動態編排!

全文目錄:

    • 開篇語
    • 前言
    • 一、責任鏈模式概述
      • 責任鏈模式的組成部分:
    • 二、責任鏈模式的核心優勢
    • 三、使用責任鏈模式解耦復雜接口
      • 1. 定義 Handler 接口
      • 2. 實現具體的 Handler
      • 3. 創建訂單對象
      • 4. 在 Spring Boot 中使用責任鏈模式
      • 5. 配置責任鏈
      • 6. 客戶端調用
    • 四、責任鏈模式的動態編排
    • 五、總結
    • 文末

開篇語

哈嘍,各位小伙伴們,你們好呀,我是喵手。運營社區:C站/掘金/騰訊云/阿里云/華為云/51CTO;歡迎大家常來逛逛

??今天我要給大家分享一些自己日常學習到的一些知識點,并以文字的形式跟大家一起交流,互相學習,一個人雖可以走的更快,但一群人可以走的更遠。

??我是一名后端開發愛好者,工作日常接觸到最多的就是Java語言啦,所以我都盡量抽業余時間把自己所學到所會的,通過文章的形式進行輸出,希望以這種方式幫助到更多的初學者或者想入門的小伙伴們,同時也能對自己的技術進行沉淀,加以復盤,查缺補漏。

小伙伴們在批閱的過程中,如果覺得文章不錯,歡迎點贊、收藏、關注哦。三連即是對作者我寫作道路上最好的鼓勵與支持!

前言

??隨著業務需求的不斷增加,很多系統中的業務邏輯變得越來越復雜,特別是在涉及多個服務或者多個步驟的接口中,如何確保每個環節的靈活性、可擴展性以及可維護性,成為了開發中必須考慮的重要問題。在這種場景下,責任鏈模式(Chain of Responsibility Pattern)應運而生,它為我們提供了一種非常好的解決方案。

??在本文中,我們將介紹如何在 Spring Boot 項目中使用責任鏈模式來解耦復雜接口的邏輯,并且通過動態編排的方式提高系統的靈活性和可擴展性。

一、責任鏈模式概述

??責任鏈模式是一種行為型設計模式,旨在通過將請求沿著處理鏈傳遞來實現解耦。它允許多個對象有機會處理請求,從而避免請求發送者與接收者之間的耦合關系。每個處理者在處理請求時決定是否將請求傳遞給鏈中的下一個處理者,這種方式使得責任的分配更加靈活。

責任鏈模式的組成部分:

  1. Handler(處理者):定義一個接口,通常包含一個處理請求的方法和指向下一個處理者的引用。
  2. ConcreteHandler(具體處理者):實現處理請求的方法,并決定是否繼續傳遞請求到鏈中的下一個處理者。
  3. Client(客戶端):向鏈中的處理者發送請求。

二、責任鏈模式的核心優勢

  1. 解耦:請求發送者不需要知道哪個對象會處理它,它只需要發出請求并交給鏈上的某個處理者,處理者的選擇完全由責任鏈決定。
  2. 靈活性和可擴展性:可以輕松地增加、刪除處理者,或者動態地改變處理鏈的順序,增加了系統的靈活性和可維護性。
  3. 動態編排:責任鏈模式適用于有多個處理步驟且每個步驟可能根據不同條件進行執行的場景。通過將處理邏輯分散到不同的處理者中,用戶可以根據業務需求動態調整處理鏈。

三、使用責任鏈模式解耦復雜接口

在實際業務中,常常會遇到這樣的問題:一個接口的執行需要多個步驟,而每個步驟都有不同的處理邏輯。如果這些邏輯直接寫在接口中,接口會變得非常復雜且難以維護。

例如,假設我們有一個訂單處理的場景,其中訂單需要經過多個環節的處理,如驗證訂單、計算訂單金額、檢查庫存、處理支付等。如果把所有這些處理邏輯都放到一個方法中,代碼會非常混亂,且擴展不方便。責任鏈模式可以將每個處理環節抽象為一個獨立的處理者,并根據需要動態構建責任鏈。

1. 定義 Handler 接口

首先,我們需要定義一個處理者接口,所有的具體處理者都會實現這個接口:

public interface OrderHandler {void handle(Order order);void setNextHandler(OrderHandler nextHandler);
}
  • handle(Order order):處理當前請求的方法,訂單對象作為請求傳遞。
  • setNextHandler(OrderHandler nextHandler):設置下一個處理者。

2. 實現具體的 Handler

接下來,我們實現多個具體的處理者。例如,OrderValidationHandler 用于訂單驗證,OrderCalculationHandler 用于計算訂單金額,OrderPaymentHandler 用于支付處理等:

public class OrderValidationHandler implements OrderHandler {private OrderHandler nextHandler;@Overridepublic void handle(Order order) {System.out.println("Validating order...");// 執行訂單驗證邏輯if (order.isValid()) {if (nextHandler != null) {nextHandler.handle(order);}} else {System.out.println("Order validation failed.");}}@Overridepublic void setNextHandler(OrderHandler nextHandler) {this.nextHandler = nextHandler;}
}public class OrderCalculationHandler implements OrderHandler {private OrderHandler nextHandler;@Overridepublic void handle(Order order) {System.out.println("Calculating order amount...");// 執行訂單金額計算邏輯order.setAmount(order.getAmount() * 1.1); // 假設給訂單加上10%的稅if (nextHandler != null) {nextHandler.handle(order);}}@Overridepublic void setNextHandler(OrderHandler nextHandler) {this.nextHandler = nextHandler;}
}public class OrderPaymentHandler implements OrderHandler {private OrderHandler nextHandler;@Overridepublic void handle(Order order) {System.out.println("Processing payment...");// 執行支付邏輯if (order.getAmount() > 0) {System.out.println("Payment processed successfully!");if (nextHandler != null) {nextHandler.handle(order);}} else {System.out.println("Payment failed due to invalid amount.");}}@Overridepublic void setNextHandler(OrderHandler nextHandler) {this.nextHandler = nextHandler;}
}

3. 創建訂單對象

Order 類包含訂單的基本信息,例如金額、驗證狀態等:

public class Order {private double amount;private boolean valid;public Order(double amount, boolean valid) {this.amount = amount;this.valid = valid;}public double getAmount() {return amount;}public void setAmount(double amount) {this.amount = amount;}public boolean isValid() {return valid;}public void setValid(boolean valid) {this.valid = valid;}
}

4. 在 Spring Boot 中使用責任鏈模式

通過 Spring Boot,我們可以將這些責任鏈的處理者作為 Spring 的 Bean 注入,從而靈活地在服務中動態創建和修改責任鏈的順序。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class OrderService {private final OrderHandler firstHandler;@Autowiredpublic OrderService(OrderHandler firstHandler) {this.firstHandler = firstHandler;}public void processOrder(Order order) {firstHandler.handle(order);}
}

5. 配置責任鏈

在 Spring Boot 中,我們可以通過配置類來定義責任鏈的順序:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class OrderConfig {@Beanpublic OrderHandler orderHandler() {OrderValidationHandler validationHandler = new OrderValidationHandler();OrderCalculationHandler calculationHandler = new OrderCalculationHandler();OrderPaymentHandler paymentHandler = new OrderPaymentHandler();validationHandler.setNextHandler(calculationHandler);calculationHandler.setNextHandler(paymentHandler);return validationHandler;}
}

6. 客戶端調用

客戶端可以通過調用 OrderService 來執行訂單處理的責任鏈:

@SpringBootApplication
public class OrderApplication {public static void main(String[] args) {ApplicationContext context = SpringApplication.run(OrderApplication.class, args);OrderService orderService = context.getBean(OrderService.class);Order order = new Order(100, true); // 有效訂單orderService.processOrder(order);  // 處理訂單}
}

四、責任鏈模式的動態編排

??責任鏈模式最大的優勢之一就是動態編排。在業務流程變化或者新增業務處理邏輯時,我們可以在運行時靈活地調整處理者的順序,甚至添加新的處理環節,而無需大幅修改現有的代碼結構。

例如,在實際業務中,如果我們要在訂單處理中加入新的環節(如 OrderNotificationHandler),只需要簡單地創建一個新的處理者,并將其加入到責任鏈中。

五、總結

??責任鏈模式在 Spring Boot 項目中的應用非常靈活,它通過解耦復雜接口的邏輯、動態編排處理順序,為我們提供了一種可擴展、易維護的解決方案。通過將業務處理流程分解為多個獨立的處理者,我們可以方便地管理每個環節的業務邏輯,并在必要時靈活調整和擴展業務流程。

??使用責任鏈模式,我們不僅能夠優化系統的結構,還能夠提升系統的靈活性和可維護性,特別是當面對復雜的業務流程時,責任鏈模式尤為有效。

… …

文末

好啦,以上就是我這期的全部內容,如果有任何疑問,歡迎下方留言哦,咱們下期見。

… …

學習不分先后,知識不分多少;事無巨細,當以虛心求教;三人行,必有我師焉!!!

wished for you successed !!!


??若喜歡我,就請關注我叭。

??若對您有用,就請點贊叭。
??若有疑問,就請評論留言告訴我叭。


版權聲明:本文由作者原創,轉載請注明出處,謝謝支持!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/75668.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/75668.shtml
英文地址,請注明出處:http://en.pswp.cn/web/75668.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

COMSOL仿真遇到的兩個小問題

最近跑熱仿真的時候跑出了兩個問題,上網查發現也沒什么解決方式,最后自己誤打誤撞的摸索著解決了,在這里分享一下。 問題一 我當時一準備跑仿真就彈出了這個東西,但在此之前從未遇到 然后我試著在它說的路徑中建立recoveries文件…

如何在英文學術寫作中正確使用標點符號?

標點符號看似微不足道,但它們是書面語言的無名英雄。就像熟練的指揮家指揮管弦樂隊一樣,標點符號可以確保您的寫作流暢、傳達正確的含義并引起讀者的共鳴。正如放錯位置的音符會在音樂中造成不和諧一樣,放錯位置的逗號或缺少分號也會使您的寫…

【深度學習與大模型基礎】第10章-期望、方差和協方差

一、期望 ——————————————————————————————————————————— 1. 期望是什么? 期望(Expectation)可以理解為“長期的平均值”。比如: 擲骰子:一個6面骰子的點數是1~6&#x…

JAVA虛擬機(JVM)學習

入門 什么是JVM JVM:Java Virtual Machine,Java虛擬機。 JVM是JRE(Java Runtime Environment)的一部分,安裝了JRE就相當于安裝了JVM,就可以運行Java程序了。JVM的作用:加載并執行Java字節碼(.class&#…

【數據結構與算法】——堆(補充)

前言 上一篇文章講解了堆的概念和堆排序,本文是對堆的內容補充 主要包括:堆排序的時間復雜度、TOP 這里寫目錄標題 前言正文堆排序的時間復雜度TOP-K 正文 堆排序的時間復雜度 前文提到,利用堆的思想完成的堆排序的代碼如下(包…

什么是柜臺債

柜臺債(柜臺債券業務)是指通過銀行等金融機構的營業網點或電子渠道,為投資者提供債券買賣、托管、結算等服務的業務模式。它允許個人、企業及機構投資者直接參與銀行間債券市場的交易,打破了以往僅限機構參與的壁壘。以下是綜合多…

【Android讀書筆記】讀書筆記記錄

文章目錄 一. Android開發藝術探索1. Activity的生命周期和啟動模式1.1 生命周期全面分析 一. Android開發藝術探索 1. Activity的生命周期和啟動模式 1.1 生命周期全面分析 onPause和onStop onPause后會快速調用onStop,極端條件下直接調用onResume 當用戶打開新…

Java對象內存結構詳解

Java對象內存結構詳解 Java對象在JVM內存中的存儲結構可以分為三個部分:對象頭(Header)、實例數據(Instance Data)和對齊填充(Padding)。以下是64位JVM(開啟壓縮指針)下…

【TI MSPM0】Printf重定向學習

一、新建工程 通過XDS110與電腦進行通信。 選擇這兩個引腳 需要添加這兩個頭文件 在程序中添加這三個函數即可對printf進行重定向 二、封裝函數 另一種方法 封裝一個函數,定義一個數組

深度強化學習基礎 0:通用學習方法

過去自己學習深度強化學習的痛點: 只能看到各種術語、數學公式勉強看懂,沒有建立清晰且準確關聯 多變量交互關系浮于表面,有時候連環境、代理控制的變量都混淆 模型種類繁多,概念繁雜難整合、對比或復用,無框架分析所…

asm匯編源代碼之-字庫轉換程序

將標準的16x16點陣漢字庫(下載16x16漢字庫)轉換成適合VGA文本模式下顯示的點陣漢字庫 本程序需要調用file.asm中的子程序,所以連接時需要把file連接進來,如下 C:\> tlink chghzk file 調用參數描述如下 C:\> chghzk ; 無調用參數,轉換標準庫文件(SRC16.FNT)為適合VGA…

uniapp轉換markdown

效果 AI智能體 微信小程序 流式 1.安裝Node.js 參考:2024最新版Node.js下載安裝及環境配置教程(非常詳細)_node.js 安裝-CSDN博客 2.需要克隆項目到本地或直接到項目地址下載壓縮包。 參考:uniapp中解析markdown支持網頁和小程序_uniapp ma…

用java代碼如何存取數據庫的blob字段

一.業務 在業務中我們被要求將文件或圖片等轉成 byte[] 或 InputStream存到數據庫的Blob類型的字段中. 二.Blob類型介紹 在 MySQL 中,Blob 數據類型用于存儲二進制數據。MySQL 提供了四種不同的 Blob 類型: TINYBLOB: 最大存儲長度為 255 個字節。BL…

qemu(2) -- 定制開發板

1. 前言 qemu支持自定義開發板,本文就記錄一下折騰的過程。基于qemu-10.0.0-rc3添加x210vb3s開發板。 2. 添加板卡文件 網上參考了一些文章,有些文章使用的版本和我的不一樣,折騰起來費了點時間,最后發現還是直接參考qemu中已有…

Python在糖尿病分類問題上尋找具有最佳 ROC AUC 分數和 PR AUC 分數(決策樹、邏輯回歸、KNN、SVM)

Python在糖尿病分類問題上尋找具有最佳 ROC AUC 分數和 PR AUC 分數(決策樹、邏輯回歸、KNN、SVM) 問題模板解題思路1. 導入必要的庫2. 加載數據3. 劃分訓練集和測試集4. 數據預處理5. 定義算法及其參數6. 存儲算法和對應指標7. 訓練模型并計算指標8. 找…

CPU(中央處理器)

一、CPU的定義與核心作用 CPU 是計算機的核心部件,負責 解釋并執行指令、協調各硬件資源 以及 完成數據處理,其性能直接影響計算機的整體效率。 核心功能: 從內存中讀取指令并譯碼。執行算術邏輯運算。控制數據在寄存器、內存和I/O設備間的…

上層 Makefile 控制下層 Makefile 的方法

在復雜的項目中,通常會將項目劃分為多個模塊或子項目,每個模塊都有自己的 Makefile。上層 Makefile 的作用是協調和控制這些下層 Makefile 的構建過程。下面是幾種常見的示例,實現上層 Makefile 對下層 Makefile 的控制。 直接調用&#xff1…

prompts提示詞經典模板

prompts.py 中的提示詞模板詳解 文件中定義了兩個核心提示詞模板:REASON_PROMPT 和 RELEVANT_EXTRACTION_PROMPT。這兩個模板在 DeepResearcher 的推理過程中扮演著關鍵角色。下面我將詳細解析這兩個模板的結構和功能。 REASON_PROMPT 詳解 REASON_PROMPT 是用于指…

使用python獲取電腦硬盤信息

import psutil# 獲取硬盤信息 disk_partitions psutil.disk_partitions() print(disk_partitions) for partition in disk_partitions:print(f"設備: {partition.device}")print(f"掛載點: {partition.mountpoint}")print(f"文件系統類型: {partitio…

HarmonyOS-ArkUI V2裝飾器: @Provider和@Consumer裝飾器:跨組件層級雙向同步

作用 我們在之前學習的那些控件中,各有特點,也各有缺陷,至今沒有痛痛快快的出現過真正能跨組件的雙向綁定的裝飾器。 比如 @Local裝飾器,不能跨組件@Param裝飾器呢,能跨組件傳遞,但是僅僅就是下一層組件接收參數。另外,它是單向傳遞,不可被重新賦值。如果您非要改值則…