使用spring外掛實現策略模式
策略模式是一種行為設計模式,可讓您定義一系列演算法/實現並允許在執行時選擇它們。
假設我們有一個支援不同支付型別的支付服務,如信用卡、貝寶、條紋等。我們想根據使用者請求決定使用哪種支付方式。讓我們開始實施。
新增spring外掛依賴:
<dependency> <groupId> org.springframework.plugin </groupId> <artifactId> spring-plugin-核心</artifactId> <version> 2.0.0.RELEASE </version> </dependency> |
支付外掛程式碼:
import org.springframework.plugin.core.Plugin; public interface PaymentPlugin extends Plugin<PaymentMethod> { void pay(int paymentAmount); } |
PaymentPlugin 介面是我們定義合約的基本介面。這裡我們需要擴充套件外掛並傳遞一個類型別作為用於解析外掛(實現)的型別引數。
這裡 PaymentMethod 是一個列舉,它包含不同型別的支付方式。
我們來看看Spring外掛的
Plugin |
package org.springframework.plugin.core; public interface Plugin<S> { boolean supports(S var1); } |
下面是 PaymentPlugin對其的一種實現:
import org.springframework.stereotype.Component; import lombok.extern.slf4j.Slf4j; @Component @Slf4j public class PayByPaypal implements PaymentPlugin { @Override public void pay(int paymentAmount) { log.info("Paid by paypal, amount: " + paymentAmount); } @Override public boolean supports(PaymentMethod paymentMethod) { return paymentMethod == PaymentMethod.PAYPAL; } } |
我們必須覆蓋 pay 方法和 support 方法,pay 方法包含需要執行的演算法/業務邏輯,支援外掛介面附帶的方法決定是否應該根據給定的分隔符呼叫外掛(在我們的例子中為 PaymentPlugin) . 我新增了另一個類 PayByCard 來模擬通過卡功能支付。接下來我們將使用一個服務類來註冊我們的外掛並使用它。
package com.rkdevblog.plugin; import java.util.Optional; import org.springframework.plugin.core.PluginRegistry; import org.springframework.plugin.core.config.EnablePluginRegistries; import org.springframework.stereotype.Service; import lombok.RequiredArgsConstructor; @Service @EnablePluginRegistries(PaymentPlugin.class) @RequiredArgsConstructor public class PaymentService { private final PluginRegistry<PaymentPlugin, PaymentMethod> plugins; public PaymentPlugin choosePaymentMethod(PaymentMethod paymentMethod) { Optional<PaymentPlugin> pluginFor = plugins.getPluginFor(paymentMethod); if (pluginFor.isPresent()) { return pluginFor.get(); } throw new UnsupportedOperationException("No such payment method"); } } |
在服務類中,我們通過使用@EnablePluginRegistries 為配置的外掛型別啟用 PluginRegistry 例項,注入 PluginRegistry 並使用它通過傳遞 PaymentMethod 來選擇外掛,PaymentMethod 將相應地返回 PaymentPlugin 的例項。
現在讓我們執行應用程式並檢視,在主類中呼叫 PaymentService 並傳遞您需要的 PaymentMethod 並檢查日誌輸出。
測試PaymentMethod Card :
@Bean ApplicationRunner runner(PaymentService paymentService) { return args -> { PaymentPlugin paymentPlugin = paymentService.choosePaymentMethod(PaymentMethod.CARD); paymentPlugin.pay(10); }; } |
測試PaymentMethod Paypal:
@Bean ApplicationRunner runner(PaymentService paymentService) { return args -> { PaymentPlugin paymentPlugin = paymentService.choosePaymentMethod(PaymentMethod.PAYPAL); paymentPlugin.pay(10); }; } |
程式碼下載:https://github.com/Rajithkonara/spring-plugin
相關文章
- Spring中實現策略模式示例Spring模式
- 使用Spring實施策略模式 - javarevisitedSpring模式Java
- 策略模式、策略模式與Spring的碰撞模式Spring
- SDK 開發使用 VirtualAPK 實現外掛化APK
- 【Maven實戰技巧】「外掛使用專題」Maven-Assembly外掛實現自定義打包Maven
- Spring Boot 策略模式Spring Boot模式
- 用SpringBoot實現策略模式Spring Boot模式
- Spring Boot 如何熱載入jar實現動態外掛?Spring BootJAR
- Spring Boot 如何熱載入 jar 實現動態外掛?Spring BootJAR
- 實現TensorRT-7.0外掛自由!(如果不踩坑使用TensorRT外掛功能)
- 設計模式學習-使用go實現外觀模式設計模式Go
- Spring 實現策略模式--自定義註解方式解耦if...elseSpring模式解耦
- PHP外掛系統的實現(七):外掛案例PHP
- 使用自定義註解透過BeanPostProcessor實現策略模式Bean模式
- PHP外掛系統的實現(五):觸發外掛PHP
- Go 實現常用設計模式(二)策略模式Go設計模式
- Go 實現常用設計模式(三)策略模式Go設計模式
- Java設計模式實現之二--策略模式Java設計模式
- 更優雅地實現策略模式模式
- Headshot外掛如何使用?Headshot外掛使用教程
- 使用流水線外掛實現持續整合、持續部署
- JavaScript原生實現樓梯外掛JavaScript
- 手動實現HTML外掛BeautifyHTML
- AppDomain實現【外掛式】開發APPAI
- HtmlWebpackPlugin外掛和HtmlWebpackInlineSourcePlugin外掛的使用HTMLWebPlugininline
- fastadmin的【外掛管理】外掛使用教程AST
- PHP外掛系統的實現(二):獲取全部外掛資訊PHP
- 從零實現一個 VuePress 外掛Vue
- PHP外掛系統的實現(一)PHP
- videojs外掛使用IDEJS
- Head 外掛使用
- Go 實現常用設計模式(八)外觀模式Go設計模式
- webpack入口、出口、模式、loader、外掛Web模式
- DevOps: 使用Maven外掛實現分環境配置和版本檢查devMaven
- 使用Spring GraalVM Native外掛提高SpringBoot啟動時間94%LVMSpring Boot
- spring注入bean的幾種策略模式SpringBean模式
- PHP外掛系統的實現(三):實現探測器PHP
- kPagination-純js實現分頁外掛JS