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

Springboot整合策略模式詳解

 更新時(shí)間:2023年01月18日 08:48:18   作者:掉發(fā)的小王  
這篇文章主要介紹了Springboot整合策略模式詳解的相關(guān)資料,需要的朋友可以參考下

一、前言

策略模式可能是在工作中使用最多的,也是在面試中最常提到的,代碼重構(gòu)和優(yōu)化的必備!
小編之前也是一直說,其實(shí)沒有真正的實(shí)戰(zhàn);最近有了機(jī)會實(shí)戰(zhàn)了一下,來分享一下使用心得和在企業(yè)級的使用!

二、策略模式

1. 什么是策略模式

策略模式,英文全稱是 Strategy Design Pattern。在 GoF 的《設(shè)計(jì)模式》一書中,它是這樣定義的:

定義一族算法類,將每個(gè)算法分別封裝起來,讓它們可以互相替換。策略模式可以使算法的變化獨(dú)立于使用它們的客戶端(這里的客戶端代指使用算法的代碼)。

2. 策略模式結(jié)構(gòu)組成

  • Strategy:抽象策略類,一般為接口或者策略類
  • ConcreteStrategy:具體算法實(shí)現(xiàn)策略類
  • Context:環(huán)境或者上下文類,用于統(tǒng)一執(zhí)行具體策略

其實(shí)以上三部分用白話文來解釋就是:
需要一個(gè)接口和策略進(jìn)行規(guī)范和約束接口和方法,這時(shí)需要一些具體的實(shí)現(xiàn)算法類去繼承或者實(shí)現(xiàn)剛剛的接口和策略,最后通過一個(gè)環(huán)境或者上下文,也可以叫做工廠根據(jù)類型進(jìn)行調(diào)用具體的算法!

3. 使用場景

  • 避免冗長的 if-else 或 switch 分支判斷
  • 需要動態(tài)地在幾種算法中選擇一種
  • 對客戶隱藏具體策略 (算法) 的實(shí)現(xiàn)細(xì)節(jié),彼此完全獨(dú)立,擴(kuò)展其余不受影響

具體場景一般為:

  • 支付方式選擇
  • 打折、滿減方式選擇
  • 根據(jù)類型調(diào)用不同的系統(tǒng)

4. 優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

  • 擴(kuò)展性好
  • 符合開閉原則
  • 符合單一職責(zé)原則
  • 可讀性好
  • 便于維護(hù)
  • 避免多層判斷

缺點(diǎn):

  • 策略過多,導(dǎo)致策略類
  • 對新手讀代碼不友好

三、策略模式實(shí)戰(zhàn)

1. 實(shí)戰(zhàn)例子

今天小編根據(jù)春夏秋冬四季需要做不同的事情來演示一下策略模式的使用方案;
需求是:
如果是春天,就要去放風(fēng)箏
如果是夏天,就要去游泳
如果是秋天,就要去看楓葉
如果是冬天,就要去打雪仗
沒有使用策略模式的話,肯定就是
if-if else進(jìn)行實(shí)現(xiàn)!
下面就帶大家體會一下具體使用哈??!

2. 策略接口

/**
 * 四季策略
 * @author wangzhenjun
 * @date 2022/12/1 9:30
 */
public interface SeasonsStrategy {

    /**
     * 根據(jù)季節(jié)去執(zhí)行不同的方案
     * @param seasons
     * @return
     */
    String execute(String seasons);
}

3. 春季具體實(shí)現(xiàn)

/**
 * 春季具體實(shí)現(xiàn)
 * @author wangzhenjun
 * @date 2022/12/1 9:34
 */
// 指定容器的名稱,不指定默認(rèn)為類名稱首字母小寫
@Component("spring")
public class SpringStrategy implements SeasonsStrategy{
    @Override
    public String execute(String seasons) {

        return seasons + "來了!我們一起去放風(fēng)箏吧!";
    }
}

4. 夏季具體實(shí)現(xiàn)

/**
 * 夏季具體實(shí)現(xiàn)
 * @author wangzhenjun
 * @date 2022/12/1 9:34
 */
// 指定容器的名稱,不指定默認(rèn)為類名稱首字母小寫
@Component("summer")
public class SummerStrategy implements SeasonsStrategy{
    @Override
    public String execute(String seasons) {

        return seasons + "來了!我們一起去游泳吧!";
    }
}

5. 秋季具體實(shí)現(xiàn)

/**
 * 秋季具體實(shí)現(xiàn)
 * @author wangzhenjun
 * @date 2022/12/1 9:34
 */
// 指定容器的名稱,不指定默認(rèn)為類名稱首字母小寫
@Component("autumn")
public class AutumnStrategy implements SeasonsStrategy{
    @Override
    public String execute(String seasons) {

        return seasons + "來了!我們一起去放看楓葉吧!";
    }
}

6. 冬季具體實(shí)現(xiàn)

/**
 * 冬季具體實(shí)現(xiàn)
 * @author wangzhenjun
 * @date 2022/12/1 9:34
 */
// 指定容器的名稱,不指定默認(rèn)為類名稱首字母小寫
@Component("winter")
public class WinterStrategy implements SeasonsStrategy{
    @Override
    public String execute(String seasons) {

        return seasons + "來了!我們一起去打雪仗吧!";
    }
}

7. 上下文工廠實(shí)現(xiàn)

private Map<String, SeasonsStrategy> seasonsMap;這是最重要的,很多時(shí)候我們都知道怎么進(jìn)行策略和實(shí)現(xiàn)怎么寫,不知道怎么統(tǒng)一去放進(jìn)去,來進(jìn)行調(diào)用,可以自己放在map中。當(dāng)然spring已經(jīng)給我們組裝好了,只要按需調(diào)用即可!

核心:
Spring會自動將Strategy接口的實(shí)現(xiàn)類注入到這個(gè)Map中,key為bean id,value值則為對應(yīng)的策略實(shí)現(xiàn)類!

/**
 * 環(huán)境或者上下文類,用于統(tǒng)一執(zhí)行具體策略
 * @author wangzhenjun
 * @date 2022/12/1 9:56
 */
@Component
public class SeasonsFactory {
    /**
     * Spring會自動將Strategy接口的實(shí)現(xiàn)類注入到這個(gè)Map中,key為bean id,value值則為對應(yīng)的策略實(shí)現(xiàn)類
     */
    @Autowired
    private Map<String, SeasonsStrategy> seasonsMap;

    /**
     * 處理四季統(tǒng)一入口方法
     * @param seasons
     * @param beanName
     * @return
     */
    public String handle(String seasons,String beanName){
    	// 根據(jù)bean的名稱獲取對應(yīng)的算法處理類
        SeasonsStrategy seasonsStrategy = seasonsMap.get(beanName);
        String execute = seasonsStrategy.execute(seasons);
        return execute;
    }
}

8. controller處理

@Slf4j
@RestController
@RequestMapping("/test")
public class TestController {
	
    @Autowired
    private SeasonsFactory seasonsFactory;

    @GetMapping("/strategyTest/{seasons}/{beanName}")
    public Result strategyTest(@PathVariable("seasons") String seasons,@PathVariable("beanName") String beanName){
        String handle = seasonsFactory.handle(seasons, beanName);
        return Result.success(handle);
    }
}

9. 測試

http://localhost:8087/test/strategyTest/春天/spring

http://localhost:8087/test/strategyTest/夏天/summer

四、總結(jié)

在策略模式中定義了一系列算法,將每一個(gè)算法封裝起來,并讓它們可以相互替換,互不影響。

策略模式得益于按照開閉原則進(jìn)行設(shè)計(jì),各個(gè)具體算法按照單一職責(zé)原則設(shè)計(jì); 提高了代碼的復(fù)用性,對客戶隱藏具體策略 (算法) 的實(shí)現(xiàn)細(xì)節(jié),彼此完全獨(dú)立,擴(kuò)展其余不受影響;避免if-else 或 switch 分支語句判斷;其缺點(diǎn)在于客戶端必須知道所有的策略類,增加了系統(tǒng)中類的個(gè)數(shù)。

在日常開發(fā)一般用于消除多重判斷,有時(shí)候不要為了用設(shè)計(jì)模式而用設(shè)計(jì)模式,一定要結(jié)合業(yè)務(wù)場景,過度設(shè)計(jì)也是很致命的?。?/p>

如果對你有幫助,還請不要吝嗇您的發(fā)財(cái)小手,你的一鍵三連是我寫作的動力,謝謝大家哈??!

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

相關(guān)文章

  • AntDesign多環(huán)境配置啟動過程詳解

    AntDesign多環(huán)境配置啟動過程詳解

    這篇文章主要為大家介紹了AntDesign多環(huán)境配置啟動過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • IDEA導(dǎo)入jar包的完整實(shí)現(xiàn)步驟

    IDEA導(dǎo)入jar包的完整實(shí)現(xiàn)步驟

    由于導(dǎo)入jar包項(xiàng)目存在很多不確定的問題,導(dǎo)致每次都需要調(diào)試、配置好多遍,對此特意記錄下來,這篇文章主要給大家介紹了關(guān)于IDEA導(dǎo)入jar包的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • Spring框架整合Java Web Token問題

    Spring框架整合Java Web Token問題

    這篇文章主要介紹了Spring框架整合Java Web Token問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • Spring?Cloud?Alibaba?Nacos兩種檢查機(jī)制

    Spring?Cloud?Alibaba?Nacos兩種檢查機(jī)制

    這篇文章主要介紹了Spring?Cloud?Alibaba?Nacos兩種檢查機(jī)制,作為注冊中心不止提供了服務(wù)注冊和服務(wù)發(fā)現(xiàn)功能,它還提供了服務(wù)可用性監(jiān)測的機(jī)制,下面我們就一起進(jìn)入文章了解具體詳情吧
    2022-05-05
  • Springboot如何使用Map將錯(cuò)誤提示輸出到頁面

    Springboot如何使用Map將錯(cuò)誤提示輸出到頁面

    這篇文章主要介紹了Springboot如何使用Map將錯(cuò)誤提示輸出到頁面,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Java超詳細(xì)講解多線程中的Process與Thread

    Java超詳細(xì)講解多線程中的Process與Thread

    進(jìn)程process:在一定的環(huán)境下,把靜態(tài)的程序代碼運(yùn)行起來,通過使用不同的資源,來完成一定的任務(wù);線程thread:是程序中一個(gè)單一的順序控制流程。在單個(gè)進(jìn)程中同時(shí)運(yùn)行多個(gè)線程完成不同的工作,稱為多線程
    2022-05-05
  • EasyCode整合mybatis-plus的配置詳解

    EasyCode整合mybatis-plus的配置詳解

    本文主要介紹了EasyCode整合mybatis-plus的配置詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • Mybatis-Plus中的MetaObjectHandler組件的使用

    Mybatis-Plus中的MetaObjectHandler組件的使用

    MetaObjectHandler是Mybatis-Plus中一個(gè)實(shí)用組件,專門用于自動處理實(shí)體對象中的特定字段,如創(chuàng)建時(shí)間、更新時(shí)間、創(chuàng)建人和修改人等,該接口允許開發(fā)者在不修改業(yè)務(wù)代碼的情況下,實(shí)現(xiàn)自動填充功能,極大地簡化了代碼的復(fù)雜性,感興趣的可以了解一下
    2024-10-10
  • Java實(shí)現(xiàn)讀取不同格式的文件的示例詳解

    Java實(shí)現(xiàn)讀取不同格式的文件的示例詳解

    在?Java?開發(fā)中,我們經(jīng)常需要讀取不同類型的文件,包括?Excel?表格文件、"doc"?等,本文將介紹如何使用?Java?讀取這些不同類型的文件,需要的可以參考下
    2024-01-01
  • Spring Cloud Alibaba 之 Nacos教程詳解

    Spring Cloud Alibaba 之 Nacos教程詳解

    Nacos是阿里的一個(gè)開源產(chǎn)品,它是針對微服務(wù)架構(gòu)中的服務(wù)發(fā)現(xiàn)、配置管理、服務(wù)治理的綜合性解決方案。這篇文章主要介紹了Spring Cloud Alibaba 之 Nacos的相關(guān)知識,需要的朋友可以參考下
    2020-11-11

最新評論

黄大仙区| 湖北省| 麟游县| 斗六市| 竹山县| 谢通门县| 桃江县| 天祝| 临桂县| 库伦旗| 凌源市| 淮安市| 娱乐| 六枝特区| 铜梁县| 新密市| 古蔺县| 桐城市| 阿巴嘎旗| 综艺| 宣武区| 宜城市| 吉水县| 磐石市| 元谋县| 定结县| 富宁县| 洪泽县| 巩留县| 涪陵区| 保亭| 错那县| 阜新市| 禹州市| 昌吉市| 宁乡县| 元谋县| 新闻| 华安县| 彝良县| 博乐市|