成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Springboot整合策略模式概念->使用場景->優缺點->企業級實戰

開發 架構
策略模式得益于按照開閉原則進行設計,各個具體算法按照單一職責原則設計;提高了代碼的復用性,對客戶隱藏具體策略 (算法) 的實現細節,彼此完全獨立,擴展其余不受影響;避免if-else 或 switch 分支語句判斷;其缺點在于客戶端必須知道所有的策略類,增加了系統中類的個數。

一、前言

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

二、策略模式

1、什么是策略模式

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

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

2、策略模式結構組成

  • Strategy:抽象策略類,一般為接口或者策略類
  • ConcreteStrategy:具體算法實現策略類
  • Context:環境或者上下文類,用于統一執行具體策略

其實以上三部分用白話文來解釋就是:
需要一個接口和策略進行規范和約束接口和方法,這時需要一些具體的實現算法類去繼承或者實現剛剛的接口和策略,最后通過一個環境或者上下文,也可以叫做工廠根據類型進行調用具體的算法!

3、使用場景

  • 避免冗長的 if-else 或 switch 分支判斷
  • 需要動態地在幾種算法中選擇一種
  • 對客戶隱藏具體策略 (算法) 的實現細節,彼此完全獨立,擴展其余不受影響

具體場景一般為:

  • 支付方式選擇
  • 打折、滿減方式選擇
  • 根據類型調用不同的系統

4、優缺點

優點:

  • 擴展性好
  • 符合開閉原則
  • 符合單一職責原則
  • 可讀性好
  • 便于維護
  • 避免多層判斷

缺點:

  • 策略過多,導致策略類
  • 對新手讀代碼不友好

三、策略模式實戰

1、實戰例子

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

2、策略接口

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

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

3、春季具體實現

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

return seasons + "來了!我們一起去放風箏吧!";
}
}

4、夏季具體實現

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

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

5、秋季具體實現

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

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

6、冬季具體實現

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

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

7、上下文工廠實現

??private Map<String, SeasonsStrategy> seasonsMap;??這是最重要的,很多時候我們都知道怎么進行策略和實現怎么寫,不知道怎么統一去放進去,來進行調用,可以自己放在map中。當然spring已經給我們組裝好了,只要按需調用即可!

核心:
Spring會自動將Strategy接口的實現類注入到這個Map中,key為bean id,value值則為對應的策略實現類!?

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

/**
* 處理四季統一入口方法
* @param seasons
* @param beanName
* @return
*/
public String handle(String seasons,String beanName){
// 根據bean的名稱獲取對應的算法處理類
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??

圖片

四、總結

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

策略模式得益于按照開閉原則進行設計,各個具體算法按照單一職責原則設計;提高了代碼的復用性,對客戶隱藏具體策略 (算法) 的實現細節,彼此完全獨立,擴展其余不受影響;避免if-else 或 switch 分支語句判斷;其缺點在于客戶端必須知道所有的策略類,增加了系統中類的個數。

在日常開發一般用于消除多重判斷,有時候不要為了用設計模式而用設計模式,一定要結合業務場景,過度設計也是很致命的!

責任編輯:姜華 來源: 小王博客基地
相關推薦

2023-03-20 09:17:13

策略模式Springboot

2023-08-29 08:47:13

設計模式Springboot

2023-06-05 08:07:33

JavaJava SPI

2022-10-28 07:15:26

策略模式使用場景UML

2022-12-23 08:28:42

策略模式算法

2011-12-06 14:02:27

企業級移動開發

2023-04-28 08:21:36

SpringBoot聲明式事務編程式事務

2021-03-04 09:00:00

架構Lambda工具

2024-01-25 10:14:09

HashSetHashMapJava

2018-04-26 10:15:06

IBMLinuxONE

2021-04-12 10:11:42

TiDB 5.0數據庫

2023-02-02 09:37:59

消息隊列MQ

2009-01-03 14:54:36

ibmdwWebSphere

2023-02-15 18:12:43

開發企業級CLI

2011-07-11 09:32:54

VMware ToolVMware性能

2022-09-20 07:36:43

云原生存儲方案

2010-05-12 22:34:16

2012-11-07 15:04:13

紅帽OpenShift

2014-09-24 13:32:41

企業號

2012-08-24 11:05:51

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 在线日韩欧美 | 免费观看一级特黄欧美大片 | 99reav| 永久看片 | 成人免费区一区二区三区 | 黄色a三级 | 97精品超碰一区二区三区 | 无码一区二区三区视频 | 欧美综合久久久 | 日韩福利 | 日韩精品在线看 | 久久久久久国产精品 | 日本在线你懂的 | 91精品国产99 | 中文字幕亚洲一区二区三区 | 另类视频在线 | 日韩午夜网站 | 国产高清精品在线 | 亚洲视频中文字幕 | 99精品视频一区二区三区 | 欧美日韩精品综合 | 精品中文在线 | 色播99 | 国产亚洲一区二区精品 | 精品入口麻豆88视频 | 成人在线一区二区 | 精品亚洲一区二区三区 | 国产日韩一区二区三区 | 国产精品视频一二三区 | 精品一区二区三区在线观看国产 | 欧美日韩一区二区三区四区 | 日韩欧美在线观看 | 久久看精品 | 午夜精品久久久久久不卡欧美一级 | 国产精品一区二区久久精品爱微奶 | 岛国av在线免费观看 | 欧美日韩一区二区三区四区 | 欧美在线观看黄色 | 国产成人精品久久二区二区91 | 亚洲一区在线日韩在线深爱 | 国精日本亚洲欧州国产中文久久 |