泛型加持的策略模式:打造高擴展的通用策略工具類

一、傳統策略模式的痛點與突破

1.1 傳統策略實現回顧

// 傳統支付策略接口
public interface PaymentStrategy {void pay(BigDecimal amount);
}// 具體策略實現
public class AlipayStrategy implements PaymentStrategy {public void pay(BigDecimal amount) { /* 支付寶支付邏輯 */ }
}// 策略上下文
public class PaymentContext {private PaymentStrategy strategy;public void setStrategy(PaymentStrategy strategy) {this.strategy = strategy;}public void executePayment(BigDecimal amount) {strategy.pay(amount);}
}

存在問題
? 策略類型固定,無法通用化
? 新增策略需修改上下文類
? 無法動態管理策略集合


二、泛型化策略工具類設計

2.1 核心接口定義

/*** 通用策略接口* @param <T> 策略參數類型* @param <R> 返回結果類型*/
public interface GenericStrategy<T, R> {/*** 是否支持當前策略類型*/boolean support(String strategyType);/*** 執行策略*/R apply(T param);
}

2.2 策略上下文工具類

public class StrategyContext<T, R> {private final Map<String, GenericStrategy<T, R>> strategyMap = new ConcurrentHashMap<>();/*** 注冊策略*/public void registerStrategy(String strategyType, GenericStrategy<T, R> strategy) {strategyMap.put(strategyType, strategy);}/*** 執行策略*/public R execute(String strategyType, T param) {GenericStrategy<T, R> strategy = Optional.ofNullable(strategyMap.get(strategyType)).orElseThrow(() -> new IllegalArgumentException("未找到策略: " + strategyType));return strategy.apply(param);}/*** 批量執行策略*/public List<R> executeAll(T param) {return strategyMap.values().stream().map(s -> s.apply(param)).collect(Collectors.toList());}
}

三、Spring集成與自動裝配

3.1 自動注冊策略實現

@Configuration
public class StrategyAutoConfiguration {/*** 自動發現所有策略Bean并注冊*/@Beanpublic <T, R> StrategyContext<T, R> strategyContext(List<GenericStrategy<T, R>> strategies) {StrategyContext<T, R> context = new StrategyContext<>();strategies.forEach(strategy -> context.registerStrategy(strategy.getClass().getAnnotation(StrategyType.class).value(),strategy));return context;}
}/*** 策略類型注解*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface StrategyType {String value();
}

3.2 策略實現示例

@StrategyType("alipay")
@Component
public class AlipayStrategy implements GenericStrategy<PaymentRequest, PaymentResult> {@Overridepublic boolean support(String strategyType) {return "alipay".equals(strategyType);}@Overridepublic PaymentResult apply(PaymentRequest request) {// 支付寶支付具體實現}
}

四、企業級應用案例

4.1 支付策略路由

@RestController
@RequestMapping("/payment")
public class PaymentController {@Autowiredprivate StrategyContext<PaymentRequest, PaymentResult> paymentContext;@PostMapping("/{type}")public PaymentResult pay(@PathVariable String type, @RequestBody PaymentRequest request) {return paymentContext.execute(type, request);}
}

4.2 動態折扣計算

public enum DiscountType {NEW_USER, FESTIVAL, VIP_LEVEL
}public class DiscountStrategy implements GenericStrategy<DiscountType, BigDecimal> {private static final Map<DiscountType, BigDecimal> DISCOUNT_MAP = Map.of(DiscountType.NEW_USER, new BigDecimal("0.9"),DiscountType.FESTIVAL, new BigDecimal("0.8"),DiscountType.VIP_LEVEL, new BigDecimal("0.7"));@Overridepublic boolean support(String strategyType) {return Arrays.stream(DiscountType.values()).anyMatch(e -> e.name().equals(strategyType));}@Overridepublic BigDecimal apply(DiscountType type) {return DISCOUNT_MAP.get(type);}
}

五、高級功能擴展

5.1 策略優先級控制

public class PriorityStrategyContext<T, R> extends StrategyContext<T, R> {private final PriorityQueue<GenericStrategy<T, R>> priorityQueue = new PriorityQueue<>(Comparator.comparingInt(this::getPriority));private int getPriority(GenericStrategy<T, R> strategy) {return strategy.getClass().isAnnotationPresent(StrategyPriority.class) ?strategy.getClass().getAnnotation(StrategyPriority.class).value() : 0;}@Overridepublic void registerStrategy(String type, GenericStrategy<T, R> strategy) {super.registerStrategy(type, strategy);priorityQueue.offer(strategy);}public R executeFirst(T param) {return priorityQueue.peek().apply(param);}
}

5.2 策略執行監控

public class MonitoredStrategyContext<T, R> extends StrategyContext<T, R> {private final MeterRegistry meterRegistry;@Overridepublic R execute(String strategyType, T param) {Timer.Sample sample = Timer.start(meterRegistry);try {R result = super.execute(strategyType, param);sample.stop(meterRegistry.timer("strategy.execute.time", "type", strategyType));return result;} catch (Exception e) {meterRegistry.counter("strategy.error", "type", strategyType).increment();throw e;}}
}

六、最佳實踐總結

  1. 合理定義策略邊界:每個策略應聚焦單一職責

  2. 統一異常處理:定義策略執行異常體系

  3. 版本控制策略:支持多版本策略共存

  4. 動態配置支持:結合配置中心實現熱更新

  5. 性能優化:緩存高頻使用策略

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

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

相關文章

物聯網從HomeAssistant開始

文章目錄 一、什么是home-assistant?1.核心架構2.集成架構 二、在樹梅派5上安裝home-assistant三、接入米家1.對比下趨勢2.手動安裝插件3.配置方式 四、接入公牛1.手動安裝插件2.配置方式 五、接入海爾1.手動安裝插件2.配置方式 六、接入國家電網 一、什么是home-assistant? …

系統架構-嵌入式系統架構

原理與特征 嵌入式系統的典型架構可概括為兩種模式&#xff0c;即層次化模式架構和遞歸模式架構 層次化模式架構&#xff0c;位于高層的抽象概念與低層的更加具體的概念之間存在著依賴關系&#xff0c;封閉型層次架構指的是&#xff0c;高層的對象只能調用同一層或下一層對象…

計算機圖形學編程(使用OpenGL和C++)(第2版)學習筆記 09.天空和背景

天空和背景 對于 3D 場景&#xff0c;通常可以通過在遠處的地平線附近創造一些逼真的效果&#xff0c;來增強其真實感。我們可以采用天空盒、天空柱&#xff08;Skydome&#xff09;或天空穹&#xff08;Skydome&#xff09;等技術來模擬天空。 天空盒 天空盒&#xff08;Sk…

【Leetcode 每日一題】1550. 存在連續三個奇數的數組

問題背景 給你一個整數數組 a r r arr arr&#xff0c;請你判斷數組中是否存在連續三個元素都是奇數的情況&#xff1a;如果存在&#xff0c;請返回 t r u e true true&#xff1b;否則&#xff0c;返回 f a l s e false false。 數據約束 1 ≤ a r r . l e n g t h ≤ 10…

面試題解析 | C++空類的默認成員函數(附生成條件與底層原理)

在C面試中&#xff0c;“空類默認生成哪些成員函數”是考察對象模型和編譯器行為的高頻題目。許多資料僅提及前4個函數&#xff0c;但完整的答案應包含6個核心函數&#xff0c;并結合C標準深入解析其生成規則與使用場景。 一、空類默認生成的6大成員函數 1. ?缺省構造函數? …

視頻編解碼學習7之視頻編碼簡介

視頻編碼技術發展歷程與主流編碼標準詳解 視頻編碼技術是現代數字媒體領域的核心技術之一&#xff0c;它通過高效的壓縮算法大幅減少了視頻數據的體積&#xff0c;使得視頻的存儲、傳輸和播放變得更加高效和經濟。從早期的H.261標準到最新的AV1和H.266/VVC&#xff0c;視頻編碼…

使用Stable Diffusion(SD)中,步數(Steps)指的是什么?該如何使用?

Ⅰ定義&#xff1a; 在Stable Diffusion&#xff08;SD&#xff09;中&#xff0c;步數&#xff08;Steps&#xff09; 指的是采樣過程中的迭代次數&#xff0c;也就是模型從純噪聲一步步“清晰化”圖像的次數。你可以理解為模型在畫這張圖時“潤色”的輪數。 Ⅱ步數的具體作…

消息隊列如何保證消息可靠性(kafka以及RabbitMQ)

目錄 RabbitMQ保證消息可靠性 生產者丟失消息 MQ丟失消息 消費端丟失了數據 Kakfa的消息可靠性 生產者的消息可靠性 Kakfa的消息可靠性 消費者的消息可靠性 RabbitMQ保證消息可靠性 生產者丟失消息 1.事務消息保證 生產者在發送消息之前&#xff0c;開啟事務消息隨后生…

如何查看項目是否支持最新 Android 16K Page Size 一文匯總

前幾天剛聊過 《Google 開始正式強制 Android 適配 16 K Page Size》 之后&#xff0c;被問到最多的問題是「怎么查看項目是否支持 16K Page Size」 &#xff1f;其實有很多直接的方式&#xff0c;但是最難的是當你的項目有很多依賴時&#xff0c;怎么知道這個「不支持的動態庫…

HttpServletResponse的理解

HttpServletResponse 是 Java Servlet API 提供的一個接口 常用方法 方法用途setContentType(String type)設置響應內容類型&#xff08;如 "application/json"、"text/html"&#xff09;setStatus(int sc)設置響應狀態碼&#xff08;如 200、404&#x…

可靈 AI:開啟 AI 視頻創作新時代

在當今數字化浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;技術正以前所未有的速度滲透到各個領域&#xff0c;尤其是在內容創作領域&#xff0c;AI 的應用正引發一場革命性的變革。可靈 AI 作為快手團隊精心打造的一款前沿 AI 視頻生成工具&#xff0c;宛如一顆璀璨的…

用 AltSnap 解鎖 Windows 窗口管理的“魔法”

你有沒有遇到過這樣的場景&#xff1a;電腦屏幕上堆滿了窗口&#xff0c;想快速調整它們的大小和位置&#xff0c;卻只能拖來拖去&#xff0c;費時又費力&#xff1f;或者你是個多任務狂魔&#xff0c;喜歡一邊寫代碼、一邊看文檔、一邊刷視頻&#xff0c;卻發現 Windows 自帶的…

深度策略梯度算法PPO

一、策略梯度核心思想和原理 從時序差分算法Q學習到深度Q網絡&#xff0c;這些算法都側重于學習和優化價值函數&#xff0c;屬于基于價值的強化學習算法&#xff08;Value-based&#xff09;。 1. 基于策略方法的主要思想&#xff08;Policy-based&#xff09; 基于價值類方…

【LaTeX】Word插入LaTeX行間公式如何編號和對齊

在 Word 文檔中插入公式&#xff0c;需要用到 LaTeX \LaTeX LATE?X 。但遺憾的是&#xff0c;Word 只支持部分 LaTeX \LaTeX LATE?X 語法&#xff0c;這就導致很多在 Markdown 能正常渲染的公式在 Word 中無法正常顯示。 “內嵌”和“顯示” 首先介紹一下 Word 的“內嵌”…

互聯網大廠Java面試實戰:Spring Boot到微服務的技術問答解析

&#x1f4aa;&#x1f3fb; 1. Python基礎專欄&#xff0c;基礎知識一網打盡&#xff0c;9.9元買不了吃虧&#xff0c;買不了上當。 Python從入門到精通 &#x1f601; 2. 畢業設計專欄&#xff0c;畢業季咱們不慌忙&#xff0c;幾百款畢業設計等你選。 ?? 3. Python爬蟲專欄…

spring boot3.0自定義校驗注解:文章狀態校驗示例

文章目錄 Spring Boot 自定義校驗注解&#xff1a;狀態校驗示例一、創建 State 注解步驟&#xff1a;1. 創建自定義注解&#xff1a;2. 實現校驗邏輯&#xff1a; 二、 實現自定義校驗步驟:1. 在實體類中使用自定義校驗注解 State&#xff1a;2. 添加 State 注解&#xff1a; 總…

無侵入式彈窗體驗_探索 Chrome 的 Close Watcher API

1. 引言 在網頁開發中,彈窗(Popup)是一種常見的交互方式,用于提示用戶進行操作、確認信息或展示關鍵內容。然而,傳統的 JavaScript 彈窗方法如 alert()、confirm() 和 prompt() 存在諸多問題,包括阻塞主線程、樣式不可定制等。 為了解決這些問題,Chrome 瀏覽器引入了 …

調出事件查看器界面的4種方法

方法1. 方法2. 方法3. 方法4.

Ubuntu 安裝遠程桌面連接RDP方式

1. 安裝 XFCE4 桌面環境 如果你的 Ubuntu 系統默認使用 GNOME 或其它桌面環境&#xff0c;可以安裝輕量級的 XFCE4&#xff1a; sudo apt update sudo apt install xfce4 xfce4-goodies 說明&#xff1a;xfce4-goodies 包含額外的插件和工具&#xff08;如面板插件、終端等&a…

LWIP傳輸層協議筆記

傳輸協議簡介 文件/圖片/視頻 都是一堆二進制數據 經過傳輸層來傳輸 這兩種協議有什么區別呢&#xff1f; 傳輸層的TCP/UDP三個步驟 TCP使用傳輸流程 1、三次握手 作用&#xff1a;三次握手就是建立連接的過程 2、傳輸數據 作用&#xff1a;建立連接完成之后&#xff…