JAVA設計模式-策略模式及在Springboot2.X中寫法

JAVA設計模式-策略模式及在Springboot2.X中寫法

  • 一、經典的策略模式寫法
  • 二、Springboot2.X中策略模式寫法

策略模式的定義:策略模式是一種行為型設計模式,定義了一系列算法,并將每個算法封裝起來,使它們可以互相替換
策略模式:在策略模式(Strategy Pattern)中,一個類的行為或其算法可以在運行時更改。這種類型的設計模式屬于行為型模式。
在策略模式中,我們創建表示各種策略的對象和一個行為隨著策略對象改變而改變的 context 對象。策略對象改變 context 對象的執行算法。

主要解決:在有多種算法相似的情況下,使用 if…else 所帶來的復雜和難以維護。

何時使用:一個系統有許多許多類,而區分它們的只是他們直接的行為。

如何解決:將這些算法封裝成一個一個的類,任意地替換。

關鍵代碼:實現同一個接口。

應用實例: 1、諸葛亮的錦囊妙計,每一個錦囊就是一個策略。 2、旅行的出游方式,選擇騎自行車、坐汽車,每一種旅行方式都是一個策略。 3、JAVA AWT 中的 LayoutManager。

策略模式三種角色

  • 1、環境上下文(Context)角色:持有一個Strategy引用,委托策略變量調用具體策略所實現的策略接口中的方法。
  • 2、策略(Strategy)角色:抽象角色,通常由一個接口或抽象類實現,此角色給出所有的具體策略類所需接口。
  • 3、具體策略(ConcreteStrategy)角色:具體實現策略接口的類,包裝了相關的算法或行為。

一、經典的策略模式寫法

/*** 策略接口*/
public interface Strategy {int doOperation(int num1, int num2);
}/*** 加法策略*/
class OperationAdd implements Strategy {@Overridepublic int doOperation(int num1, int num2) {return num1 + num2;}
}/*** 減法策略*/
class OperationSub implements Strategy {@Overridepublic int doOperation(int num1, int num2) {return num1 - num2;}
}/*** 策略上下文類*/
class Context {private Strategy strategy;public Context(Strategy strategy) {this.strategy = strategy;}public Strategy getStrategy() {return strategy;}public void setStrategy(Strategy strategy) {this.strategy = strategy;}public int executeStrategy(int num1, int num2) {return strategy.doOperation(num1, num2);}
}class Main{public static void main(String[] args){// 策略上下文Context context = new Context(new OperationAdd());// 加法策略System.out.println("10 + 5 = " + context.executeStrategy(10, 5));// 減法策略context = new Context(new OperationSub());System.out.println("10 - 5 = " + context.executeStrategy(10, 5));}
}

但是上述的寫法中,在具體使用過程中,要需要new具體的策略,而不能簡單的傳輸一些字段來實現

二、Springboot2.X中策略模式寫法

參考鏈接
在這里插入圖片描述

在springboot中實現的時候可以采用@Component來標記為bean,通過獲取bean來直接得到想要的具體策略

下述例子采用數據庫存儲的方式,將具體的code和beanId關聯在一起,通過code–>獲取beanId–>獲取bean–>執行bean,從而不需要在Context中寫if-else,或者在調用過程中寫死new具體的策略

同理,使用 讀取緩存、讀取枚舉、讀取數據庫等方式來實現,一定程度上解耦了抽象類和實體類之間的關聯。
1.首先定義策略模式的策略接口

public interface Strategy {int doOperation(int num1, int num2);
}

2.定義具體的策略
在springboot中可以使用@Component標記一個類為組件

實現加法策略

@Component
public class OperationAdd implements Strategy {@Overridepublic int doOperation(int num1, int num2) {return num1 + num2;}
}

實現減法策略

@Component
class OperationSub implements Strategy {@Overridepublic int doOperation(int num1, int num2) {return num1 - num2;}
}

3.實現環境上下文Context

@Component
public class ContextStrategy {@Resourceprivate OperatorMapper operatorMapper;public int executeStrategy(int code,int num1, int num2) {OperatorEntity entity = OperatorMapper.getOperator(code);Strategy strategy = SpringUtils.getBean(entity.getStrategyBeanId(),Strategy.class);return strategy.doOperation(num1, num2);}
}

4.使用

@RestController
public class OperatorController {@Autowiredprivate ContextStrategy contextStrategy;@GetMapping("/toDoOperator")public String toDoOperator(String code,int num1,int num2){return contextStrategy.doOperation(code,num1,num2);}
}

5.細節部分

注意:這里有個細節問題,數據庫存儲的beanId一定要跟我們定義的bean保持一致,否則根據beanId去spring容器中獲取實例對象會失敗!
附根據beanId獲取對應實例對象的utils

/*** 根據beanId 從spring容器中獲取對象*/
@Component
public class SpringUtils implements ApplicationContextAware {private static ApplicationContext applicationContext;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;}//獲取applicationContextpublic static ApplicationContext getApplicationContext() {return applicationContext;}//通過name獲取 Bean.public static Object getBean(String name){return getApplicationContext().getBean(name);}//通過class獲取Bean.public static <T> T getBean(Class<T> clazz){return getApplicationContext().getBean(clazz);}//通過name,以及Clazz返回指定的Beanpublic static <T> T getBean(String name,Class<T> clazz){return getApplicationContext().getBean(name, clazz);}}

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

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

相關文章

算法 java 排序和查找

排序和查找 冒泡排序&#xff08;穩定&#xff09;選擇排序&#xff08;不穩定&#xff09;插入排序&#xff08;穩定&#xff09;希爾排序&#xff08;不穩定&#xff09;歸并排序&#xff08;穩定&#xff09;快速排序&#xff08;不穩定&#xff09;堆排序計數排序桶排序基數…

YOLOv8+PyQt5海洋船只檢測(可以重新訓練,yolov8模型,從圖像、視頻和攝像頭三種路徑識別檢測)

1.效果視頻&#xff1a;海洋船只檢測yoloV8檢測&#xff08;https://mbd.pub/o/bread/mbd-ZpaYk55r&#xff09;_嗶哩嗶哩_bilibili資源包含可視化的海洋船只檢測系統&#xff0c;可對于高空拍攝到的海洋圖片進行輪船檢測&#xff0c;基于最新的YOLOv8訓練的海洋船只檢測模型&a…

多線程知識-11

Runnable 和 Thread 用哪個好 使用Runnable接口的好處是&#xff1a; 避免了單繼承的限制&#xff1a;當你的類已經繼承了另一個類時&#xff0c;你仍然可以實現Runnable接口來創建線程。提高代碼的復用性&#xff1a;你可以將Runnable對象傳遞給多個線程來執行&#xff0c;從…

C++設計模式-策略模式,AI角色動態選擇行為

運行在VS2022&#xff0c;x86&#xff0c;Debug下。 27. 策略模式 策略模式讓算法的選擇與使用獨立開來&#xff0c;使得代碼更靈活、可擴展和易維護。應用&#xff1a;如在游戲開發中&#xff0c;AI角色需要根據環境和條件做出不同的行為&#xff0c;如尋路、攻擊、躲避等。可…

深度解析CSS中為什么會有Stacking Context的概念

CSS中的堆疊上下文&#xff08;Stacking Context&#xff09;概念是為了管理和控制網頁元素的重疊順序而引入的。堆疊上下文的引入解決了以下幾個關鍵問題&#xff1a; 層次管理&#xff1a; 在網頁中&#xff0c;多個元素可能會相互重疊&#xff0c;堆疊上下文定義了這些元素的…

01-CompressionWebpackPlugin---提高 Web 應用性能的利器

CompressionWebpackPlugin—提高 Web 應用性能的利器 筆記分享 在現代 Web 開發中&#xff0c;優化資源加載速度是提升用戶體驗的重要環節。減少文件大小可以顯著提升網頁加載速度&#xff0c;從而改善用戶體驗。CompressionWebpackPlugin 是一個強大的 Webpack 插件&#xff…

【安裝筆記-20240529-Windows-Electerm 終端工具】

安裝筆記-系列文章目錄 安裝筆記-20240529-Windows-Electerm 終端工具 文章目錄 安裝筆記-系列文章目錄安裝筆記-20240529-Windows-Electerm 終端工具 前言一、軟件介紹名稱&#xff1a;Wireshark主頁官方介紹功能特性 二、安裝步驟測試版本&#xff1a;electerm-1.39.35-win-…

【藍橋杯】常見的數據結構

&#x1f338;個人主頁&#xff1a;Yang-ai-cao &#x1f4d5;系列專欄&#xff1a;藍橋杯 C語言 &#x1f34d;博學而日參省乎己&#xff0c;知明而行無過矣 目錄 &#x1f338;個人主頁&#xff1a;Yang-ai-cao &#x1f4d5;系列專欄&#xff1a;藍橋杯 C語言 &…

Spring項目中Ordered接口的應用:全局過濾器(GlobalFilter)的順序控制

在Spring框架&#xff0c;尤其是Spring Cloud Gateway或Spring WebFlux項目中&#xff0c;Ordered接口扮演著重要的角色&#xff0c;特別是在實現全局過濾器(GlobalFilter)時&#xff0c;用于控制過濾器執行的優先級。下面將介紹如何在Spring項目中使用Ordered接口來管理Global…

【AIoT-Robot】3d hand pose

手語是聾啞人士的主要溝通工具,它是利用手部和身體的動作來傳達意義。雖然手語幫助它的使用者之間互相溝通,但聾啞人士與一般人的溝通卻十分困難,這個溝通障礙是源于大部分人不懂得手語。 1. 手勢&&手語 手勢:手的姿勢 ,通常稱作手勢。它指的是人在運用手臂時,所…

初識springcloud

springcloud eureka eureka的作用 消費者該如何獲取服務提供者具體信息&#xff1f; 服務提供者啟動時向eureka注冊自己的信息,eureka保存這些信息消費者,根據服務名稱向eureka拉取提供者信息 如果有多個服務提供者&#xff0c;消費者該如何選擇&#xff1f; 服務消費者利…

創建模塊

自學python如何成為大佬(目錄):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在Python中&#xff0c;自定義模塊有兩個作用&#xff1a;一個是規范代碼&#xff0c;讓代碼更易于閱讀&#xff0c;另一個是方便其他程序使用已經編…

ORACLE創建dblink

dblink的作用 dblink數據庫鏈接顧名思義就是數據庫的鏈接&#xff0c;當我們要跨本地數據庫&#xff0c;訪問另外一個數據庫表中的數據時&#xff0c;本地數據庫中就必須要創建遠程數據庫的dblink&#xff0c;通過dblink本地數據庫可以像訪問本地數據庫一樣訪問遠程數據庫表中…

Ubuntu22.04之解決:terminal使用alt+1/alt+2/alt+3失效問題(二百三十八)

簡介&#xff1a; CSDN博客專家&#xff0c;專注Android/Linux系統&#xff0c;分享多mic語音方案、音視頻、編解碼等技術&#xff0c;與大家一起成長&#xff01; 優質專欄&#xff1a;Audio工程師進階系列【原創干貨持續更新中……】&#x1f680; 優質專欄&#xff1a;多媒…

安卓玩機搞機技巧綜合資源----電腦控制手機 投屏操控的軟件工具操作步驟解析【二十二】

接上篇 安卓玩機搞機技巧綜合資源------如何提取手機分區 小米機型代碼分享等等 【一】 安卓玩機搞機技巧綜合資源------開機英文提示解決dm-verity corruption your device is corrupt. 設備內部報錯 AB分區等等【二】 安卓玩機搞機技巧綜合資源------EROFS分區格式 小米紅…

外發郵件監控的六種方法, 監控軟件如何防止郵件泄密?

外發郵件監控的六種方法&#xff0c; 監控軟件如何防止郵件泄密&#xff1f; 外發郵件監控是現代企業信息安全管理的重要組成部分&#xff0c;它有助于防止敏感信息泄露、保護知識產權、以及確保企業合規。以下是外發郵件監控的幾種主要方法&#xff0c;這些方法結合使用可以為…

2024最新 Jenkins + Docker實戰教程(八)- Jenkins實現集群并發構建

&#x1f604; 19年之后由于某些原因斷更了三年&#xff0c;23年重新揚帆起航&#xff0c;推出更多優質博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有堅忍不拔之志 &#x1f390; 個人CSND主頁——Mi…

【Python Cookbook】S01E14 從字典中提取子集

目錄 問題解決方案討論 問題 如果我們想基于一個字典的子集創建另外一個字典&#xff0c;該如何做&#xff1f; 解決方案 利用 字典推導式 來解決問題&#xff1a; prices {ACME: 45.23,AAPL: 612.78,IBM: 205.55,HPQ: 37.20,FB: 10.75 }p1 {key:value for key, value in…

AI學習指南機器學習篇-邏輯回歸損失函數和優化

AI學習指南機器學習篇-邏輯回歸損失函數和優化 引言 在機器學習中&#xff0c;邏輯回歸是一種常用的分類算法。在邏輯回歸中&#xff0c;我們需要定義一個損失函數來衡量模型預測值與實際標簽之間的誤差&#xff0c;并且需要通過優化算法來最小化損失函數&#xff0c;從而得到…

群體優化算法----人工蜂群優化算法應用于路徑規劃(機器人避開平面障礙尋找最短路線)

介紹 人工蜂群優化算法&#xff08;Artificial Bee Colony Algorithm, ABC&#xff09;是由Dervis Karaboga在2005年提出的一種模擬蜜蜂覓食行為的優化算法。該算法基于蜜蜂群體的分工合作和信息交流機制&#xff0c;通過模擬蜜蜂尋找食物源的過程來解決優化問題。ABC算法因其…