策略模式處理

首先,定義接口或抽象父類。例如,定義一個Strategy接口,里面有execute方法。然后不同的策略類實現這個接口,比如ConcreteStrategyA、ConcreteStrategyB等,每個類用@Component注解,可能指定Bean的名字,或者用默認的類名首字母小寫作為Bean名稱。

然后,需要將這些Bean自動注入到一個Map中。Spring支持將同一類型的Bean注入到Map中,其中鍵是Bean的名稱,值是對應的實例。例如,在某個服務類中,使用@Autowired private Map<String, Strategy> strategies; 這樣,Spring會自動將所有的Strategy實現類放入這個Map,鍵是Bean的名稱。

接下來,當需要執行某個策略時,根據傳入的key(即Bean的名稱)從Map中獲取對應的實例,調用其execute方法。例如,在服務類中有一個方法,接收策略名稱作為參數,然后調用strategies.get(name).execute()。

在Spring框架中,使用策略模式并結合依賴注入可以通過以下步驟實現將子類實例存入Map,并通過指定名稱執行對應方法:

1. 定義策略接口或抽象類

public interface PaymentStrategy {void processPayment(double amount);
}

2. 實現具體策略類(子類)

使用@Component并為每個策略指定唯一的Bean名稱:

@Component("creditCard")
public class CreditCardPayment implements PaymentStrategy {@Overridepublic void processPayment(double amount) {System.out.println("使用信用卡支付:" + amount);}
}@Component("alipay")
public class AlipayPayment implements PaymentStrategy {@Overridepublic void processPayment(double amount) {System.out.println("使用支付寶支付:" + amount);}
}

3. 注入策略Map并執行

@Service
public class PaymentService {private final Map<String, PaymentStrategy> strategies;// 通過構造器注入,Key為Bean名稱,Value為實例@Autowiredpublic PaymentService(Map<String, PaymentStrategy> strategyMap) {this.strategies = strategyMap;}public void executePayment(String method, double amount) {PaymentStrategy strategy = strategies.get(method);if (strategy == null) {throw new IllegalArgumentException("無此支付方式: " + method);}strategy.processPayment(amount);}
}

4. 使用示例

@RestController
public class PaymentController {@Autowiredprivate PaymentService paymentService;@PostMapping("/pay")public String pay(@RequestParam String method, @RequestParam double amount) {paymentService.executePayment(method, amount);return "支付成功";}
}

關鍵點說明

  • 自動注入Map:Spring會自動將相同類型(PaymentStrategy)的Bean注入到Map中,Key為Bean名稱,Value為實例。
  • 策略擴展:新增支付方式只需添加實現類并用@Component("新名稱")標記,無需修改其他代碼。
  • 異常處理:當傳入不存在的Key時,需處理策略未找到的情況(如拋出異常或返回默認策略)。

自定義Map鍵名(可選)

若需使用非Bean名稱的Key,可通過自定義注解實現:

定義注解

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface PaymentType {String value();
}

應用注解到策略類

@Component
@PaymentType("credit")
public class CreditCardPayment implements PaymentStrategy { ... }

手動構建策略Map

@Service
public class PaymentService {private final Map<String, PaymentStrategy> strategies = new HashMap<>();@Autowiredpublic PaymentService(List<PaymentStrategy> strategyList) {for (PaymentStrategy strategy : strategyList) {PaymentType annotation = strategy.getClass().getAnnotation(PaymentType.class);if (annotation != null) {strategies.put(annotation.value(), strategy);}}}// 其他代碼不變
}

這種方法允許更靈活地定義策略名稱,同時保持代碼的可擴展性。

@sercice(“queryability”)

public class QueryAbilityService implement Strategy{…}

private Map<String, Strategy> strategy;

strategy.get(“key”).ifPresent(handler->handler.onmessage(input));

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

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

相關文章

go程序中使用pprof增加程序監控功能

1.什么是 pprof&#xff1f; pprof 是 Go 內置的性能分析工具&#xff0c;用于生成程序運行時的性能分析數據。它可以幫助開發者分析&#xff1a; CPU 使用情況 內存分配情況 Goroutine 狀況 系統調用分析等 2. 如何使用 pprof&#xff1f; 要使用 pprof&#xff0c;首先需要在…

javaweb自用筆記:Vue

Vue 什么是vue vue案例 1、引入vue.js文件 2、定義vue對象 3、定義vue接管的區域el 4、定義數據模型data 5、定義視圖div 6、通過標簽v-model來綁定數據模型 7、{{message}}直接將數據模型message展示出來 8、由于vue的雙向數據綁定&#xff0c;當視圖層標簽input里的…

376_C++_云透傳,板端負責處理透傳數據的API函數,用于實現客戶端對設備內部接口的訪問(VMS把數據直接傳給板端內部)

RsApi_PassThrough 云透傳,板端負責處理透傳數據的API函數,用于實現客戶端對設備內部接口的訪問(VMS把數據直接傳給板端內部) 我來分析一下 RsApi_PassThrough 函數的作用和實現邏輯: 1. 功能概述 RsApi_PassThrough 是一個透傳接口,用于處理 /API/Http/PassThrough 的…

基于eRDMA實測DeepSeek開源的3FS

DeepSeek昨天開源了3FS分布式文件系統, 通過180個存儲節點提供了 6.6TiB/s的存儲性能, 全面支持大模型的訓練和推理的KVCache轉存以及向量數據庫等能力, 每個客戶端節點支持40GB/s峰值吞吐用于KVCache查找. 發布后, 我們在阿里云ECS上進行了快速的復現, 并進行了性能測試, ECS…

計算機畢業設計SpringBoot+Vue.js醫院掛號就診系統(源碼+文檔+PPT+講解)

溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 作者簡介&#xff1a;Java領…

Linux的用戶與權限--第二天

認知root用戶&#xff08;超級管理員&#xff09; root用戶用于最大的系統操作權限 普通用戶的權限&#xff0c;一般在HOME目錄內部不受限制 su與exit命令 su命令&#xff1a; su [-] 用戶名 -符號是可選的&#xff0c;表示切換用戶后加載環境變量 參數為用戶名&#xff0c…

計算機網絡軟考

1.物理層 1.兩個主機之間發送數據的過程 自上而下的封裝數據&#xff0c;自下而上的解封裝數據&#xff0c;實現數據的傳輸 2.數據、信號、碼元 碼元就是數字通信里用來表示信息的基本信號單元。比如在二進制中&#xff0c;用高電平代表 “1”、低電平代表 “0”&#xff0c…

第四十一:Axios 模型的 get ,post請求

Axios 的 get 請求方式 9.雙向數據綁定 v-model - 鄧瑞編程 Axios 的 post 請求方式&#xff1a;

【JQuery—前端快速入門】JQuery 操作元素

JQuery 操作元素 1. 獲取/修改元素內容 三個簡單的獲取元素的方法&#xff1a; 這三個方法即可以獲取元素的內容&#xff0c;又可以設置元素的內容. 有參數時&#xff0c;就進行元素的值設置&#xff0c;沒有參數時&#xff0c;就進行元素內容的獲取. 接下來&#xff0c;我們需…

2025年4月1日-2日AutoCable 中國汽車線束線纜及連接技術創新峰會即將開幕

正如人體的心臟與四肢之間需要靠神經和血管連接&#xff0c;汽車的各個部件&#xff0c;也要靠各種電線、管道連接。線束&#xff0c;就是汽車的神經和血管&#xff0c;車主向汽車下達的每一個功能指令&#xff0c;都通過線束來傳遞&#xff0c;看似不起眼的線束&#xff0c;卻…

編程題 - 汽水瓶【JavaScript/Node.js解法】

目錄 題目描述 解題思路 代碼實現 復雜度分析 代碼解釋 輸入輸出處理 題目描述 有這樣一道經典的編程題&#xff1a;某商店規定&#xff1a;三個空汽水瓶可以換一瓶汽水。小張手上有 n 個空汽水瓶&#xff0c;他最多可以換多少瓶汽水喝&#xff1f; 解題思路 這是一個…

深度學習神經網絡分類原理

每一個神經元做的是一個類似回歸的操作 最后一層是softmax函數&#xff0c;每一個輸出就會變成一個0到1之間的數&#xff0c;也就是概率&#xff0c;然后他們之間的和加起來等于1&#xff0c;到底是哪一個分類就是看哪個神經元的這個值最大。 那么如何算損失呢&#xff1a; 加…

硬核技術組合!用 DeepSeek R1、Ollama、Docker、RAGFlow 打造專屬本地知識庫

文章目錄 一、引言二、安裝Ollama部署DeepSeekR1三、安裝Docker四、安裝使用RAGFlow4.1 系統架構4.2 部署流程4.3 使用RAGFlow4.4 在RAGFlow中新增模型4.5 創建知識庫4.6 創建私人助理使用RGA 一、引言 本地部署DeepSeek R1 Ollama RAGFlow構建個人知識庫&#xff0c;通過將…

前端實現OSS上傳圖片(Vue3+vant)

首先&#xff0c;下面這些信息從阿里云服務器OSS管理中獲取 aliyun:oss:file:endpoint: "oss-cn-beijing.aliyuncs.com"keyid: "xxxxxxxxx"keysecret: "xxxxxxxxxxxx"bucketname: "xxxx"一、安裝OSS npm install ali-oss 二、以下步…

huggingface NLP主要知識點以及超級詳解使用

1.安裝huggingface依賴庫 pip install transformers pip install datasets pip install pytorch pip install tokenizers pip install diffusers pip install accelerate pip install evaluate pip install optimum pip install pillow pip install requests pip install gr…

Spark核心之02:常用算子詳解

1、RDD操作詳解 # 啟動spark-shell spark-shell --master local[2] 1.1 基本轉換 1) map map是對RDD中的每個元素都執行一個指定的函數來產生一個新的RDD。 任何原RDD中的元素在新RDD中都有且只有一個元素與之對應。 舉例&#xff1a; scala> val a sc.parallelize(1 …

MySQL 8.X 報錯處理

1.重新加載配置 reload the configuration mysql> ALTER INSTANCE RELOAD KEYRING; ERROR 1227 (42000): Access denied; you need (at least one of) the ENCRYPTION_KEY_ADMIN privilege(s) for this operation 提示需要ENCRYPTION_KEY_ADMIN權限 重新授權 GRANT ENCR…

SQL注入練習場:PHPStudy+SQLI-LABS靶場搭建教程(零基礎友好版)

注意&#xff1a;文中涉及演示均為模擬測試&#xff0c;切勿用于真實環境&#xff0c;任何未授權測試都是違法行為&#xff01; 一、環境準備 下載PHPStudy 官網下載地址&#xff1a;https://www.xp.cn/php-study&#xff08;選擇Windows版&#xff09; 安裝時建議選擇自定…

現今大語言模型性能(準確率)比較

現今大語言模型性能(準確率)比較 表頭信息:表的標題為“大語言模型性能比較結果”(英文:Table 1: Large Language Model Performance Comparison Results),表明該表是用于對比不同大語言模型的性能。列信息: 模型:列出參與比較的不同大語言模型名稱,包括LLAMA3(70B)…

Docker創建自定義網橋并指定網段

前言 docker0是Docker默認網絡的核心組件, 通過虛擬網橋和NAT技術, 實現了容器間的通信以及容器與外部網絡的交互。然而, docker0網段是固定的(通常是172.17.0.0/16), 為了更靈活地管理容器網絡&#xff0c;Docker支持創建自定義網橋&#xff0c;允許用戶指定網段。 例如, 在…