一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 淺談用SpringBoot實現策略模式

淺談用SpringBoot實現策略模式

2022-01-25 01:02wingsless Java教程

本文主要介紹了SpringBoot實現策略模式,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

問題的提出

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

策略模式的類圖如下:

淺談用SpringBoot實現策略模式

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

策略模式代碼的實現

借助Spring框架我們能夠輕松的實現策略模式。

舉一個簡單的例子,我們去咖啡店買咖啡的時候,會根據自己的喜好和胃容量選擇大小杯。那么我們就要實現一個CoffeeStategy:

?
1
2
3
4
5
package com.example.demo.strategy;
 
public interface CoffeeStrategy {
    void offer();
}

接下來就是各種具體策略的實現了,以中杯咖啡為例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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,這個在后面的應用上下文中有起效。現在就開始定義應用上下文類:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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}。在具體的業務邏輯中,只需要引入應用上下文類,每次使用getCoffee方法就可以了。

比如這個Controller方法:

?
1
2
3
4
@GetMapping("/get")
    public void getCoffee(@Param("size") String size) {
        this.coffeeContext.getCoffee(size);
    }

請求這個接口,我們能在后臺看到具體的日志內容:

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框架去實現策略模式,那么我們的代碼要如何編寫呢?

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
package com.example.demo.strategy;
 
public class CoffeeContext {
 
    CoffeeStrategy coffeeStrategy;
    public CoffeeContext(CoffeeStrategy coffeeStrategy) {
        this.coffeeStrategy = coffeeStrategy;
    }
 
    public void getCoffee() {
        this.coffeeStrategy.offer();
    }
}

這樣,在實際使用的時候,我需要先新建一個具體的實現類對象,然后將這個對象傳入策略應用上下文去。這種方式怎么看著都沒有Spring的實現方式優雅。

?
1
2
3
CoffeeStrategy mid = new MidCoffee();
CoffeeContext context = new CoffeeContext(mid);
context.getCoffee();

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

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

心得體會

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

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

此時我是比較理解GoF在設計模式這本書里提到的一句話,大致意思就是開發一個面向對象的程序并不簡單。

到此這篇關于淺談用SpringBoot實現策略模式的文章就介紹到這了,更多相關SpringBoot 策略模式內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://www.cnblogs.com/wingsless/p/15358447.html

延伸 · 閱讀

精彩推薦
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
主站蜘蛛池模板: 日本xxx在线观看免费播放 | 午夜一区二区免费视频 | 女教师的一级毛片 | 美女模特被c免费视频 | 国产精品乱码高清在线观看 | 四虎在线最新永久免费 | 国产99精品成人免费视频 | 国产精品合集久久久久青苹果 | 国产外围 | 性xx色3d动画xx无尽 | 欧美性色黄大片四虎影视 | 91精品国产亚洲爽啪在线影院 | 幻女free性俄罗斯第一次摘花 | 日本高清va不卡视频在线观看 | 人与善xuanwen在线400 | 啊啊啊好大好爽视频 | les在宿舍吃她奶 | 国产三及 | 明星h文集合短篇小说 | 拍拍叫痛的无挡视频免费 | 深夜福利免费观看 | 校草太大了h| 国产乱人乱精一区二区视频密 | 国产清纯女高中生在线观看 | 国产乱码一卡二卡3卡四卡 国产乱插 | 99久久精品国语对白 | 91久久综合 | 亚洲成人77777 | 国产一卡二卡四卡免费 | 激情综合站 | 男人的天堂在线观看入口 | 婷婷伊人综合亚洲综合网 | 美女被灌浣肠失禁视频 | 毛片区 | 无人区国产大片 | 楚乔传第二部免费观看全集完整版 | 国产高清一区二区三区免费视频 | 99久久中文字幕伊人 | 性趣用品| 亚洲精品色婷婷在线影院麻豆 | 超级乱淫寡妇 |