欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談用SpringBoot實現(xiàn)策略模式

 更新時間:2021年10月01日 08:18:53   作者:wingsless  
本文主要介紹了SpringBoot實現(xiàn)策略模式,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

問題的提出

閱讀別人代碼的時候最討厭遇到的就是大段大段的if-else分支語句,一般來說讀到下面的時候就忘了上面在判斷什么了。很多資料上都會講到使用策略模式來改進(jì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,這個在后面的應(yīng)用上下文中有起效?,F(xiàn)在就開始定義應(yīng)用上下文類:

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è)務(wù)邏輯中,只需要引入應(yīng)用上下文類,每次使用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    : 您的大杯咖啡

進(jìn)一步的思考

之前寫過Component中起的名字有奇效。如果我們沒有用Spring框架去實現(xiàn)策略模式,那么我們的代碼要如何編寫呢?

首先可以肯定的是策略接口和策略實現(xiàn)類是不需要變的。需要變的地方就是應(yīng)用上下文了,因為不存在自動注入了。這段代碼就會變成大致這樣:

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)類對象,然后將這個對象傳入策略應(yīng)用上下文去。這種方式怎么看著都沒有Spring的實現(xiàn)方式優(yōu)雅。

CoffeeStrategy mid = new MidCoffee();
CoffeeContext context = new CoffeeContext(mid);
context.getCoffee();

在我實際改造代碼的過程中我發(fā)現(xiàn)有些策略其實是一樣的,只是個別參數(shù)不同罷了。我對接的是各個業(yè)務(wù)供應(yīng)商,有些供應(yīng)商的接口邏輯式樣的,只是URL和USERNAME不一樣罷了。于是好幾個策略實現(xiàn)類的代碼重復(fù)很嚴(yán)重,這個時候我使用了Java8開始提供的接口default方法。這種方法的好處就是能將這種一樣的邏輯提取到interface中,只要實現(xiàn)類不重寫,那么就會默認(rèn)使用default方法。

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

心得體會

在我接手現(xiàn)在這個項目代碼的時候,之前的程序員將代碼寫的很直白,就是可以不用任何的設(shè)計,直接寫邏輯。這也沒錯,可是用IDEA的時候會各種提示重復(fù)代碼啊之類的,讓人看著不開心。而且還有大量的if-else分支讓人摸不著頭腦。

在我大刀闊斧的改造之后,代碼行數(shù)越來越少,但是可讀性卻越來越高。

此時我是比較理解GoF在設(shè)計模式這本書里提到的一句話,大致意思就是開發(fā)一個面向?qū)ο蟮某绦虿⒉缓唵巍?/p>

到此這篇關(guān)于淺談用SpringBoot實現(xiàn)策略模式的文章就介紹到這了,更多相關(guān)SpringBoot 策略模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳細(xì)聊聊SpringBoot中動態(tài)切換數(shù)據(jù)源的方法

    詳細(xì)聊聊SpringBoot中動態(tài)切換數(shù)據(jù)源的方法

    在大型分布式項目中,經(jīng)常會出現(xiàn)多數(shù)據(jù)源的情況,下面這篇文章主要給大家介紹了關(guān)于SpringBoot中動態(tài)切換數(shù)據(jù)源的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-09-09
  • Java異常簡介和架構(gòu)_動力節(jié)點Java學(xué)院整理

    Java異常簡介和架構(gòu)_動力節(jié)點Java學(xué)院整理

    這篇文章主要分享了Java異常簡介和架構(gòu),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • mybatis plus實體類中字段映射mysql中的json格式方式

    mybatis plus實體類中字段映射mysql中的json格式方式

    這篇文章主要介紹了mybatis plus實體類中字段映射mysql中的json格式方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java生成唯一ID的三種方法總結(jié)

    Java生成唯一ID的三種方法總結(jié)

    單機(jī)環(huán)境下,可以使用AtomicLong來生成唯一ID;而在需要非純數(shù)字形式的場景中,可以通過UUID結(jié)合哈希函數(shù)如MD5或SHA-1轉(zhuǎn)換成數(shù)字,但需注意哈希碰撞的低概率風(fēng)險;對于分布式系統(tǒng),模擬Snowflake算法是一種復(fù)雜但有效的方法,每種方法都有其適用場景和潛在問題
    2024-09-09
  • SpringBoot 統(tǒng)一請求返回的實現(xiàn)

    SpringBoot 統(tǒng)一請求返回的實現(xiàn)

    這篇文章主要介紹了SpringBoot 統(tǒng)一請求返回的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Mybatis的Mapper代理對象生成及調(diào)用過程示例詳解

    Mybatis的Mapper代理對象生成及調(diào)用過程示例詳解

    這篇文章主要為大家介紹了Mybatis的Mapper代理對象生成及調(diào)用過程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • 使用Java開發(fā)實現(xiàn)OAuth安全認(rèn)證的應(yīng)用

    使用Java開發(fā)實現(xiàn)OAuth安全認(rèn)證的應(yīng)用

    這篇文章主要介紹了使用Java開發(fā)實現(xiàn)OAuth安全認(rèn)證的應(yīng)用的方法,OAuth安全認(rèn)證經(jīng)常出現(xiàn)于社交網(wǎng)絡(luò)API應(yīng)用的相關(guān)開發(fā)中,需要的朋友可以參考下
    2015-11-11
  • JVM類加載,垃圾回收

    JVM類加載,垃圾回收

    這篇文章主要介紹了JVM的幾種垃圾回收器,文中通過示例代碼介紹的很詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • java編程創(chuàng)建型設(shè)計模式單例模式的七種示例

    java編程創(chuàng)建型設(shè)計模式單例模式的七種示例

    這篇文章主要為大家介紹了java編程中創(chuàng)建型設(shè)計模式之單例模式的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-02-02
  • IDEA導(dǎo)入Springboot項目,注解和pom文件不識別的解決

    IDEA導(dǎo)入Springboot項目,注解和pom文件不識別的解決

    這篇文章主要介紹了IDEA導(dǎo)入Springboot項目,注解和pom文件不識別的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04

最新評論