Spring Boot中策略模式結合依賴注入的實現方式

在Spring Boot項目開發中,常常會遇到根據不同的業務場景執行不同邏輯的需求,策略模式就是一種很好的設計模式來應對這種情況。同時,Spring Boot強大的依賴注入機制可以方便地將不同的策略類進行管理和調用。

1. 定義策略接口

定義一個策略接口,所有具體的策略類都將實現這個接口:

public interface BaseStrategy {void handle(String request);
}

2. 實現具體的策略

實現幾個具體的策略類,例如處理訂單和支付:

@Component("order")
@Slf4j
public class OrderStrategy implements BaseStrategy {@Overridepublic void handle(String request) {System.out.println("下單成功" + request);}
}@Component("pay")
@Slf4j
public class PayStrategy implements BaseStrategy {@Overridepublic void handle(String request) {System.out.println("支付成功" + request);}
}

也可以通過配置類的方式注入策略模式實現類,先注釋其中的@Component注解

@Configuration
public class HandlerConfig {@Bean("order")public BaseStrategy handleOrder() {return new OrderStrategy();}@Bean("pay")public BaseStrategy handlePay() {return new PayStrategy();}
}

3. 創建策略工廠

為了方便獲取不同的策略,我們可以創建一個工廠類 BaseFactory,它將通過依賴注入管理策略的實例,并提供獲取策略的功能。

@Component
@Slf4j
public class BaseFactory {@Resourceprivate Map<String, BaseStrategy> handlerMap;public BaseStrategy getHandler(String type) {return handlerMap.getOrDefault(type, (request) -> {log.error("Unknown request type: " + type);});}
}

在這個類中,我們使用 @Resource 注解注入了一個 Map<String, BaseStrategy>,這個 Map 將所有注冊的策略按名稱存儲起來。通過策略名稱,我們可以從 Map 中獲取到對應的策略對象。

4. 使用策略工廠處理請求

@RestController
@RequestMapping("base")
@Slf4j
public class BaseController {@Resourceprivate BaseFactory baseFactory;@GetMapping("/getHandler")public ResponseEntity<String> getHandler(@RequestParam String type, @RequestParam String message) {BaseStrategy handler = baseFactory.getHandler(type);if (handler != null) {handler.handle(message);return ResponseEntity.ok("操作已執行: " + type);} else {return ResponseEntity.badRequest().body("策略類型不存在: " + type);}}
}

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

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

相關文章

深入剖析Spring Boot中Spring MVC的請求處理流程

對于任何使用Spring Boot進行Web開發的開發者而言&#xff0c;深入理解Spring MVC的執行流程都是至關重要的。這不僅有助于我們編寫更清晰、更高效的代碼&#xff0c;更是我們排查詭異問題、進行高級定制開發的知識基石。今天&#xff0c;我們將一起深入Spring Boot應用的內核&…

X448 算法簽名驗簽流程深度解析及代碼示例

一、引言&#xff1a;X448 算法的定位與價值在橢圓曲線密碼學&#xff08;ECC&#xff09;體系中&#xff0c;X448 是基于蒙哥馬利曲線&#xff08;Curve448&#xff09;的密鑰交換算法&#xff0c;但其底層數學原理也可支撐簽名驗簽功能&#xff08;實際工程中常與 Ed448 簽名…

2025-2026單片機物聯網畢業設計題目推薦(定稿付款)

51.基于單片機的非接觸式防疫自動門系&#xff08;1&#xff09;人員檢測&#xff1a;利用超聲波模塊進行人員檢測&#xff0c;檢測到人員靠近門體時觸發相應的操作&#xff1b;&#xff08;2&#xff09;門控制&#xff1a;通過舵機實現自動門的開閉控制&#xff0c;當檢測到有…

一文詳解大模型強化學習(RLHF)算法:PPO、DPO、GRPO、ORPO、KTO、GSPO

一、 引言 大模型強化學習的核心目標是讓模型的輸出與人類目標、真實場景需求對齊。在工作和學習中&#xff0c;大模型強化學習訓練經常會遇到各種算法&#xff0c;各種O&#xff0c;在強化學習訓練選型過程中經常容易混淆&#xff0c;也分不清各種訓練算法的使用場景和優缺點。…

C++ 常見面試題匯總

基礎知識 一、C 基礎語法C 和 C 的區別&#xff1f; C 支持面向對象&#xff08;封裝、繼承、多態&#xff09;。C 引入模板、STL、異常處理。值傳遞、指針傳遞、引用傳遞的區別&#xff1f; 值傳遞&#xff1a;拷貝一份副本。指針傳遞&#xff1a;傳地址&#xff0c;可修改原數…

ES06-SpringData集成

ES06-SpringData集成 文章目錄ES06-SpringData集成1-參考網址2-知識整理3-Spring Data Elasticsearch 9.0.0 完整示例4-知識補充1-Elasticsearch JAVA操作有三種客戶端:1. TransportClient&#xff08;已廢棄&#xff09;2. JestClient&#xff08;第三方 HTTP 客戶端&#xff…

對于鏈表相關經典算法題:環形鏈表的約瑟夫問題的解析

開篇介紹&#xff1a; Hello 大家&#xff0c;在上一篇博客中&#xff0c;我們一同拆解了「206. 反轉鏈表」和「876. 鏈表的中間結點」這兩道單鏈表經典題目&#xff0c;通過對指針操作的細致打磨&#xff0c;相信大家對單鏈表的特性與算法設計思路有了更深入的理解。而在今天…

MySQL集群——主從復制

目錄 一、環境搭建、部署 1. RHEL7.9、9.3的搭建 二、主從復制 1. 環境說明 2. 環境準備 1&#xff09;克隆RHEL79_mysql_master 2&#xff09;改名為 “RHEL79_mysql_slave” 并修改IP 3&#xff09;修改主機名 3. 部署MySQL主從同步 1&#xff09;主庫(mysql-master) 2&…

《用 asyncio 構建異步任務隊列:Python 并發編程的實戰與思考》

《用 asyncio 構建異步任務隊列:Python 并發編程的實戰與思考》 一、引言:并發編程的新時代 在現代軟件開發中,性能已不再是錦上添花,而是產品成功的基石。尤其在 I/O 密集型場景中,如網絡爬蟲、實時數據處理、微服務通信等,傳統的同步編程模式往往力不從心。 Python …

【Linux】yum工具篇

目錄一、軟件包管理器1.1 什么是軟件包1.2 Linux軟件生態二、yum具體操作2.1 查找軟件包2.2 安裝軟件包2.3 卸載軟件配置文件所在路徑個人主頁<—請點擊 Linux專欄<—請點擊 一、軟件包管理器 1.1 什么是軟件包 在Linux下安裝軟件, 一個通常的辦法是下載到程序的源代碼…

撬動制造全場景增效,開利空調找到了怎樣的“通關密碼”?

由深圳軟件協會指導、法大大和信息俠聯合出品的《制造行業合同數智化升級白皮書》&#xff08;以下簡稱“白皮書”&#xff09;首次提出了 “電子簽法律AI” 雙輪驅動模型。在制造行業面臨供應鏈協同、合規風控及全球化出海等多重挑戰的當下&#xff0c;法大大依托豐富的制造企…

[Android]RecycleView的item用法

RecyclerView 是 Android 提供的一個強大的列表控件&#xff0c;用來顯示大量數據。RecyclerView 的主要特點 1. 高性能的視圖復用機制 Recycle就是循環的意思&#xff0c;那么recycleview的特點也很鮮明了&#xff0c;它只會創建出在屏幕內和一定緩存的itemview,當view滑出屏幕…

AI驅動的軟件測試:革命性的自動化、缺陷檢測與實驗優化

引言在當今快節奏的軟件開發生命周期&#xff08;SDLC&#xff09;中&#xff0c;傳統測試方法已逐漸無法滿足對速度、覆蓋面和準確性的極高要求。人工智能&#xff08;AI&#xff09;和機器學習&#xff08;ML&#xff09;技術的融入&#xff0c;正在從根本上重塑軟件測試的格…

繼續優化基于樹狀數組的cuda前綴和

在之前的博客《借助樹狀數組的思想實現cuda版前綴和》中&#xff0c;我們用三個kernel實現了基于樹狀數組的cuda版前綴和&#xff0c;但是在數據量較大時速度不如傳統的reduce-then-scan方法&#xff0c;主要原因在于跨block的reduce階段沒有充分利用所有的cuda核心。在本博客中…

Qt圖片資源導入

右鍵項目&#xff0c;點擊添加新文件 選擇Qt -> Qt Resource File 資源文件起名 如&#xff1a;res 生成res.qrc文件 在項目的同級目錄下創建文件夾res&#xff0c;并將準備好的資源粘貼進去 右鍵qrc文件&#xff0c;選中Open in Editor 添加前綴 前綴是各種類型圖片的分類&…

嵌入式第四十六天(51單片機(中斷,定時器))

一.獨立按鍵設置1.#include "key.h"void init_key(void) {P1 | (0x0F << 4); }int key_pressed(void) {static int ret 0;if((P1 & (1 << 4)) 0){ret 1;}else if((P1 & (1 << 5)) 0){ret 2;}else if((P1 & (1 << 6)) 0){r…

Visual Studio Code2024安裝包及安裝教程

一、軟件下載軟件名稱&#xff1a;Visual Studio Code 2024安裝環境&#xff1a;window10及以上系統下載鏈接&#xff1a;https://pan.quark.cn/s/d9831b28c69a解壓軟件Bandizip下載鏈接&#xff1a;https://pan.quark.cn/s/a54e79b5d553二、軟件安裝1、下載后&#xff0c;先解…

fps:游戲玩法

能幫到你的話&#xff0c;就給個贊吧 &#x1f618; 文章目錄游戲玩法倒計時僵尸潮游戲成功&失敗計時玩法&#xff1a;玩家在計時內存活&#xff0c;成功&#xff1b;反之失敗Game界面&#xff1a;由關卡調用計時系統計時完成&#xff1a;調用結果界面結果界面玩家死亡&…

如何建立針對 .NET Core web 程序的線程池的長期監控

如何建立針對 .NET Core web 程序的線程池的長期監控 建立針對 .NET Core Web 應用程序線程池的長期監控是一個系統性的工程&#xff0c;它涉及代碼集成、指標收集、存儲、可視化和告警。 核心思路 線程池監控不是孤立的&#xff0c;它必須與應用程序的整體性能指標&#xff08…

前端開發學習路徑

前端開發學習路徑前端開發基礎技能HTML、CSS和JavaScript是前端開發的三大核心技術。HTML用于構建網頁結構&#xff0c;CSS負責樣式設計&#xff0c;JavaScript實現交互功能。掌握這三項技術是學習前端開發的基礎。現代前端開發通常需要了解ES6語法&#xff0c;包括箭頭函數、解…