最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

問題的提出

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

策略模式的類圖如下:

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

策略模式代碼的實(shí)現(xiàn)

借助Spring框架我們能夠輕松的實(shí)現(xiàn)策略模式。

舉一個(gè)簡單的例子,我們?nèi)タХ鹊曩I咖啡的時(shí)候,會根據(jù)自己的喜好和胃容量選擇大小杯。那么我們就要實(shí)現(xiàn)一個(gè)CoffeeStategy:

package com.example.demo.strategy;

public interface CoffeeStrategy {
    void offer();
}

接下來就是各種具體策略的實(shí)現(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注解給這個(gè)類起一個(gè)名字叫做MID,這個(gè)在后面的應(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();
    }
}

因?yàn)槭鞘褂昧薙pring框架,所有的Bean都被Spring自行管理,啟動之后,Map中會有兩個(gè)元素:{"MID":MidCoffee}和{"LARGE":LargeCoffee}。在具體的業(yè)務(wù)邏輯中,只需要引入應(yīng)用上下文類,每次使用getCoffee方法就可以了。

比如這個(gè)Controller方法:

@GetMapping("/get")
    public void getCoffee(@Param("size") String size) {
        this.coffeeContext.getCoffee(size);
    }

請求這個(gè)接口,我們能在后臺看到具體的日志內(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框架去實(shí)現(xiàn)策略模式,那么我們的代碼要如何編寫呢?

首先可以肯定的是策略接口和策略實(shí)現(xiàn)類是不需要變的。需要變的地方就是應(yīng)用上下文了,因?yàn)椴淮嬖谧詣幼⑷肓?。這段代碼就會變成大致這樣:

package com.example.demo.strategy;

public class CoffeeContext {

    CoffeeStrategy coffeeStrategy;
    public CoffeeContext(CoffeeStrategy coffeeStrategy) {
        this.coffeeStrategy = coffeeStrategy;
    }

    public void getCoffee() {
        this.coffeeStrategy.offer();
    }
}

這樣,在實(shí)際使用的時(shí)候,我需要先新建一個(gè)具體的實(shí)現(xiàn)類對象,然后將這個(gè)對象傳入策略應(yīng)用上下文去。這種方式怎么看著都沒有Spring的實(shí)現(xiàn)方式優(yōu)雅。

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

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

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

心得體會

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

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

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

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

相關(guān)文章

  • Spring 中的 ResourceLoader實(shí)例詳解

    Spring 中的 ResourceLoader實(shí)例詳解

    Spring框架提供了ResourceLoader接口,用于加載資源文件,DefaultResourceLoader是其基本實(shí)現(xiàn),只能加載單個(gè)資源,而ResourcePatternResolver繼承自ResourceLoader,增加了按模式加載多個(gè)資源的能力,感興趣的朋友一起看看吧
    2024-11-11
  • 關(guān)于IntelliJ IDEA 打包代碼報(bào)錯(cuò)的問題

    關(guān)于IntelliJ IDEA 打包代碼報(bào)錯(cuò)的問題

    這篇文章主要介紹了關(guān)于IntelliJ IDEA 打包代碼報(bào)錯(cuò)的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • hibernate通過session實(shí)現(xiàn)增刪改查操作實(shí)例解析

    hibernate通過session實(shí)現(xiàn)增刪改查操作實(shí)例解析

    這篇文章主要介紹了hibernate通過session實(shí)現(xiàn)增刪改查操作實(shí)例解析,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • Java代理模式的示例詳解

    Java代理模式的示例詳解

    代理模式(Proxy Parttern)為一個(gè)對象提供一個(gè)替身,來控制這個(gè)對象的訪問,即通過代理對象來訪問目標(biāo)對象。本文將通過示例詳細(xì)講解一下這個(gè)模式,需要的可以參考一下
    2022-02-02
  • 詳解MyEclipse中搭建spring-boot+mybatis+freemarker框架

    詳解MyEclipse中搭建spring-boot+mybatis+freemarker框架

    這篇文章主要介紹了詳解MyEclipse中搭建spring-boot+mybatis+freemarker框架,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-10-10
  • IDEA中GitLab的使用詳解

    IDEA中GitLab的使用詳解

    這篇文章主要介紹了IDEA中GitLab的使用,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-07-07
  • 解決遇到Cannot resolve ch.qos.logback:logback-classic:1.2.3錯(cuò)誤的問題

    解決遇到Cannot resolve ch.qos.logback:logback-classic:

    當(dāng)使用Maven配置項(xiàng)目依賴時(shí),可能會遇到無法解析特定版本的錯(cuò)誤,例如,logback-classic版本1.2.3可能無法在配置的倉庫中找到,解決方法包括檢查倉庫是否包含所需版本,或更新到其他可用版本,可通過Maven官網(wǎng)搜索并找到適用的版本,替換依賴配置中的版本信息
    2024-09-09
  • 微信公眾號測試賬號自定義菜單的實(shí)例代碼

    微信公眾號測試賬號自定義菜單的實(shí)例代碼

    這篇文章主要介紹了微信公眾號測試賬號自定義菜單的實(shí)例代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-02-02
  • java并發(fā)鎖的實(shí)現(xiàn)

    java并發(fā)鎖的實(shí)現(xiàn)

    Java中的鎖主要是為了解決多個(gè)線程訪問共享數(shù)據(jù)時(shí)的競爭問題,確保線程能夠安全地訪問和修改共享數(shù)據(jù),本文主要介紹了java并發(fā)鎖的實(shí)現(xiàn),感興趣的可以了解一下
    2024-04-04
  • Java?延時(shí)隊(duì)列及簡單使用方式詳解

    Java?延時(shí)隊(duì)列及簡單使用方式詳解

    這篇文章主要介紹了Java延時(shí)隊(duì)列簡單使用方式,通過本文學(xué)習(xí)知道延時(shí)隊(duì)列是什么可以用來干什么,本文通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-08-08

最新評論

应用必备| 七台河市| 郸城县| 津市市| 五大连池市| 彩票| 寻乌县| 博罗县| 永靖县| 临夏市| 平乡县| 花垣县| 黄浦区| 会理县| 台州市| 佛山市| 平定县| 北流市| 隆化县| 内乡县| 西昌市| 佛坪县| 健康| 庐江县| 云梦县| 阿坝县| 和平区| 乌鲁木齐市| 陆川县| 鹤山市| 雷州市| 柘城县| 洪泽县| 右玉县| 台湾省| 原平市| 弥勒县| 章丘市| 马边| 隆德县| 天全县|