淺談用SpringBoot實現(xiàn)策略模式
問題的提出
閱讀別人代碼的時候最討厭遇到的就是大段大段的if-else分支語句,一般來說讀到下面的時候就忘了上面在判斷什么了。很多資料上都會講到使用策略模式來改進這種代碼邏輯。
策略模式的類圖如下:

只需要按照這個圖寫代碼就可以了。
策略模式代碼的實現(xiàn)
借助Spring框架我們能夠輕松的實現(xiàn)策略模式。
舉一個簡單的例子,我們?nèi)タХ鹊曩I咖啡的時候,會根據(jù)自己的喜好和胃容量選擇大小杯。那么我們就要實現(xiàn)一個CoffeeStategy:
package com.example.demo.strategy;
public interface CoffeeStrategy {
void offer();
}
接下來就是各種具體策略的實現(xiàn)了,以中杯咖啡為例:
package com.example.demo.strategy;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Component("MID")
@Slf4j
public class MidCoffee implements CoffeeStrategy {
@Override
public void offer() {
log.info("你的中杯咖啡");
}
}
用Component注解給這個類起一個名字叫做MID,這個在后面的應用上下文中有起效?,F(xiàn)在就開始定義應用上下文類:
package com.example.demo.strategy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Map;
@Service
public class CoffeeContext {
@Autowired
private Map<String, CoffeeStrategy> coffeeStrategyMap;
public void getCoffee(String size) {
this.coffeeStrategyMap.get(size).offer();
}
}
因為是使用了Spring框架,所有的Bean都被Spring自行管理,啟動之后,Map中會有兩個元素:{"MID":MidCoffee}和{"LARGE":LargeCoffee}。在具體的業(yè)務邏輯中,只需要引入應用上下文類,每次使用getCoffee方法就可以了。
比如這個Controller方法:
@GetMapping("/get")
public void getCoffee(@Param("size") String size) {
this.coffeeContext.getCoffee(size);
}
請求這個接口,我們能在后臺看到具體的日志內(nèi)容:
2021-09-30 22:46:32.550 INFO 15628 --- [nio-8099-exec-1] com.example.demo.strategy.LargeCoffee : 您的大杯咖啡
2021-09-30 22:46:39.201 INFO 15628 --- [nio-8099-exec-7] com.example.demo.strategy.LargeCoffee : 您的大杯咖啡
進一步的思考
之前寫過Component中起的名字有奇效。如果我們沒有用Spring框架去實現(xiàn)策略模式,那么我們的代碼要如何編寫呢?
首先可以肯定的是策略接口和策略實現(xiàn)類是不需要變的。需要變的地方就是應用上下文了,因為不存在自動注入了。這段代碼就會變成大致這樣:
package com.example.demo.strategy;
public class CoffeeContext {
CoffeeStrategy coffeeStrategy;
public CoffeeContext(CoffeeStrategy coffeeStrategy) {
this.coffeeStrategy = coffeeStrategy;
}
public void getCoffee() {
this.coffeeStrategy.offer();
}
}
這樣,在實際使用的時候,我需要先新建一個具體的實現(xiàn)類對象,然后將這個對象傳入策略應用上下文去。這種方式怎么看著都沒有Spring的實現(xiàn)方式優(yōu)雅。
CoffeeStrategy mid = new MidCoffee(); CoffeeContext context = new CoffeeContext(mid); context.getCoffee();
在我實際改造代碼的過程中我發(fā)現(xiàn)有些策略其實是一樣的,只是個別參數(shù)不同罷了。我對接的是各個業(yè)務供應商,有些供應商的接口邏輯式樣的,只是URL和USERNAME不一樣罷了。于是好幾個策略實現(xiàn)類的代碼重復很嚴重,這個時候我使用了Java8開始提供的接口default方法。這種方法的好處就是能將這種一樣的邏輯提取到interface中,只要實現(xiàn)類不重寫,那么就會默認使用default方法。
這樣改造之后,我的代碼又精簡了很多。
心得體會
在我接手現(xiàn)在這個項目代碼的時候,之前的程序員將代碼寫的很直白,就是可以不用任何的設計,直接寫邏輯。這也沒錯,可是用IDEA的時候會各種提示重復代碼啊之類的,讓人看著不開心。而且還有大量的if-else分支讓人摸不著頭腦。
在我大刀闊斧的改造之后,代碼行數(shù)越來越少,但是可讀性卻越來越高。
此時我是比較理解GoF在設計模式這本書里提到的一句話,大致意思就是開發(fā)一個面向?qū)ο蟮某绦虿⒉缓唵巍?/p>
到此這篇關(guān)于淺談用SpringBoot實現(xiàn)策略模式的文章就介紹到這了,更多相關(guān)SpringBoot 策略模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于IntelliJ IDEA 打包代碼報錯的問題
這篇文章主要介紹了關(guān)于IntelliJ IDEA 打包代碼報錯的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03
hibernate通過session實現(xiàn)增刪改查操作實例解析
這篇文章主要介紹了hibernate通過session實現(xiàn)增刪改查操作實例解析,具有一定借鑒價值,需要的朋友可以參考下。2017-12-12
詳解MyEclipse中搭建spring-boot+mybatis+freemarker框架
這篇文章主要介紹了詳解MyEclipse中搭建spring-boot+mybatis+freemarker框架,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10
解決遇到Cannot resolve ch.qos.logback:logback-classic:
當使用Maven配置項目依賴時,可能會遇到無法解析特定版本的錯誤,例如,logback-classic版本1.2.3可能無法在配置的倉庫中找到,解決方法包括檢查倉庫是否包含所需版本,或更新到其他可用版本,可通過Maven官網(wǎng)搜索并找到適用的版本,替換依賴配置中的版本信息2024-09-09

