溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么用SpringBoot實現(xiàn)策略模式

發(fā)布時間:2021-10-08 09:42:19 來源:億速云 閱讀:109 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要介紹了怎么用SpringBoot實現(xiàn)策略模式,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

問題的提出

閱讀別人代碼的時候最討厭遇到的就是大段大段的if-else分支語句,一般來說讀到下面的時候就忘了上面在判斷什么了。很多資料上都會講到使用策略模式來改進這種代碼邏輯。

策略模式的類圖如下:

怎么用SpringBoot實現(xiàn)策略模式

只需要按照這個圖寫代碼就可以了。

策略模式代碼的實現(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,這個在后面的應用上下文中有起效。現(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方法。

這樣改造之后,我的代碼又精簡了很多。

感謝你能夠認真閱讀完這篇文章,希望小編分享的“怎么用SpringBoot實現(xiàn)策略模式”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學習!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI