精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

知道策略模式!但不會在項目里使用?

開發 前端
簡單的來說當做某個事情有多個方式的時候,可以抽象為接口,然后每個實現是一種解決方式,由調用方來選擇不同的實現方式。

前言

在學開發的第二年就開始聽說要想代碼寫得好,一定要會設計模式。于是就興致沖沖的啃了《Head First 設計模式》,看完之后對于策略模式映像很深刻,覺得這個模式好,易上手,應用廣,我又能優化一波代碼了,于是興致沖沖的打開了我的 IDEA,開整!!!

策略模式初體驗(錯誤示范)

在講訴我的策略模式首秀前,我們先回顧下策略模式的基本概念。

策略模式

  • 意圖:定義一系列的算法,把它們一個個封裝起來, 并且使它們可相互替換。
  • 主要解決:在有多種算法相似的情況下,使用 if…else 所帶來的復雜和難以維護。
  • 何時使用:一個系統有許多許多類,而區分它們的只是他們直接的行為。

簡單的來說當做某個事情有多個方式的時候,可以抽象為接口,然后每個實現是一種解決方式,由調用方來選擇不同的實現方式。

理解了后我開始對我們的代碼進行了重構,當時我第一家公司有這樣一段代碼,大概是這個意思(時間長了,我憑記憶重寫的)。

有這樣一個抽獎的方法,我們后臺控制中獎率,不同的時候我們會調整不同的中獎策略。

public class NumStrategy {

enum RandomEnum{
/**
* 平均策略
*/
AVERAGE,
/**
* 80%的幾率中獎
*/
RANDOM28;
}
/**
* 抽獎方法,根據不同的策略進行抽獎
* @param randomEnum
* @return true:代表中獎 false:代表沒中獎
*/
public boolean luckDraw(RandomEnum randomEnum){
if(randomEnum.equals(RandomEnum.AVERAGE)){
Random random = new Random();
int num = random.nextInt(100);
return num >= 50;
}else if(randomEnum.equals(RandomEnum.RANDOM28)){
Random random = new Random();
int num = random.nextInt(100);
return num >= 20;
}
return false;
}
}

我一看,這不就是妥妥的策略模式嗎?開搞。

一頓改造之后變成了這樣:

public class NumStrategy2 {
enum RandomEnum{
/**
* 平均策略
*/
AVERAGE,
/**
* 80%的幾率中獎
*/
RANDOM28;
}
/**
* 抽獎方法,根據不同的策略進行抽獎
* @param randomEnum
* @return
public boolean luckDraw(RandomEnum randomEnum){
if(randomEnum.equals(RandomEnum.AVERAGE)){
return new AverageStrategy().luckDraw();
}else if(randomEnum.equals(RandomEnum.RANDOM28)){
return new Random28Strategy().luckDraw();
}
return false;
}
interface LuckDrawStrategy{
boolean luckDraw();
}
class AverageStrategy implements LuckDrawStrategy{
@Override
public boolean luckDraw(){
Random random = new Random();
int num = random.nextInt(100);
return num >= 50;
}
}
class Random28Strategy implements LuckDrawStrategy{
@Override
public boolean luckDraw(){
Random random = new Random();
int num = random.nextInt(100);
return num >= 20;
}
}

}

改造完成之后我滿意的提交了代碼,但是在組長 review 的時候給我又改了回來。說你整這么多類干嘛?我理直氣壯的說我這是用策略模式優化代碼。他說沒必要,先改回去吧。

我憤憤的接受了,但心里想著:哎,你連策略模式都不懂?

經過這么多年,我開始理解我當時的做法其實不對,本來很簡單的代碼,而且里面的邏輯不會有變動,其實不需要抽象出來。我的改動有過度設計之嫌。把原來的30行代碼搞成了80行

一報還一報,這幾年我見過太多次當年的我這樣寫代碼的了。

即為了用設計模式而用設計模式。而忘了設計模式的初衷是為了代碼更易理解,更可靠,更易維護。

甚至還見過有人學了策略模式后說要把項目里所有的 if/else都安排上策略模式。

梅開二度

又過了一年多,在一次面試的時候,也有著關于策略模式的討論。

【面試官】問:你說你用過策略模式,請問你為什么用它?

【我】:為了抽離各個不同實現邏輯,優化 if/else,使代碼更簡單易懂

【面試官】:你具體說說,怎么去掉的 if/else

【我】:內心 OS(背的知識點,我也好久沒用了啊)。我硬著頭皮說,我可以使用工廠模式+策略模式來做。

【面試官】:那你工廠模式的那里不是也要用 if/else 判斷嗎?

【我】:。。。額。唔。。。那確實還是要用到 if/else

把我問住了,我支支吾吾的回答確實還是要 if/else 來判斷一次,只不過把判斷移到了工廠模式里面去了。

我下來后又去實踐了下,想著放在 map 里行不行呢?

public class NumStrategy3 {
enum RandomEnum{
/**
* 平均策略
*/
AVERAGE,
/**
* 80%的幾率中獎
*/
RANDOM28;
}
static Map<RandomEnum,LuckDrawStrategy> map = new HashMap<>();
static{
map.put(RandomEnum.RANDOM28,new Random28Strategy());
map.put(RandomEnum.AVERAGE,new AverageStrategy());
}
/**
* 抽獎方法,根據不同的策略進行抽獎
* @param randomEnum
* @return
public boolean luckDraw(RandomEnum randomEnum){
LuckDrawStrategy luckDrawStrategy = map.get(randomEnum);
return luckDrawStrategy.luckDraw();
}
interface LuckDrawStrategy{
boolean luckDraw();
}
static class AverageStrategy implements LuckDrawStrategy{
@Override
public boolean luckDraw(){
Random random = new Random();
int num = random.nextInt(100);
return num >= 50;
}
}
static class Random28Strategy implements LuckDrawStrategy{
@Override
public boolean luckDraw(){
Random random = new Random();
int num = random.nextInt(100);
return num >= 20;
}
}
}

終于是解決了 if/else 的情況,不過這樣很短的 if/else,里面邏輯不怎么變動時,我個人是不建議用策略模式,這里只是示例。

推薦用法

又過了幾年,當初的菜鳥也成長為了一個老鳥。

當時項目里有這樣一個代碼:

下面的代碼我進行了一些簡化,我們有一個功能,對頁面上的指標進行計算,不同的指標對應不同的計算方法。頁面上指標一期做 4 個,后續會做到十幾個。

public interface TransferService {
String transfer();
}
@Service
public class SearchTransformService {
@Autowired
private UserTransferService userTransferService;
@Autowired
private AgeTransferService ageTransferService;
@Autowired
private InterestTransferService interestTransferService;
/**
* 根據不同的編碼進行轉換
* @param code
* @return
public String transform(String code){
if(code.equals("user")){
return userTransferService.transfer();
}else if(code.equals("age")){
return ageTransferService.transfer();
}else if(code.equals("interest")){
return interestTransferService.transfer();
}
return "";
}
}

可以看到這樣的業務場景下,這樣的寫法 if/else 就會很長,后續十幾個的情況下就很難維護。另外 code 使用的是魔數,也是不好的一種寫法。我對此進行了優化如下:

先將 code 用枚舉定義

   enum CodeEnum {
USER("user"),
AGE("age"),
INTEREST("interest"),
;
private String code;

public String getCode() {
return code;
}
CodeEnum(String code) {
this.code = code;
}
private static final Map<String, CodeEnum> map = Arrays.stream(CodeEnum.values()).collect(Collectors.toMap(CodeEnum::getCode, Function.identity()));
public CodeEnum of(String code) {
return map.get(code);
}
}

原有的接口上增加一個transCode方法,每個實現需要聲明是對應哪個編碼的實現

public interface TransferService {

String transfer();

CodeEnum transCode();
}

@Service
public class AgeTransferService implements TransferService {
@Override
public String transfer(){
return null;
}

@Override
public CodeEnum transCode(){
return CodeEnum.AGE;
}
}

使用 map 存儲編碼對應的實現類的關聯關系,以此來獲取對應的轉換器實現類

@Service
public class SearchTransformService implements InitializingBean {
@Autowired
private List<TransferService> transferServiceList;
private Map<CodeEnum, TransferService> transferServiceMap;
@Override
// 項目啟動時將實現類放入到map中去
public void afterPropertiesSet() throws Exception {
transferServiceMap = transferServiceList.stream().collect(Collectors.toMap(TransferService::transCode, Function.identity()));
}
/**
* 根據不同的編碼進行轉換
* @param code
* @return
public String transform(String code){
TransferService transferService = transferServiceMap.get(CodeEnum.of(code));
Assert.notNull(transferService,"找不到對應的轉換器");
return transferService.transfer();
}
}

重構后是不是就很簡潔了呢?如果后續新增新的編碼轉換器,只需要先在枚舉里定義,然后新增實現類實現方法就行了,不需要關心是怎么調用的,只關心具體的實現邏輯,降低了維護成本。

這才是策略模式的真正應用吧。不要再亂用了,哈哈哈。

責任編輯:姜華 來源: 今日頭條
相關推薦

2025-04-07 13:17:49

2018-07-16 09:36:05

2022-06-23 11:22:12

LinuxLinusLinux 社區

2012-06-20 14:38:32

2010-08-26 10:06:18

微軟Hyper-VVMworld

2009-03-13 19:04:57

Windows 7發布日期

2018-04-27 15:00:54

2010-10-19 10:44:49

李開復

2022-05-05 19:00:22

PythonPython特性

2019-10-15 16:02:23

戴爾

2020-06-28 14:18:51

Android 11功能谷歌

2020-07-20 13:59:17

服務器項目工程打包

2013-12-27 15:42:34

小米閃購

2015-07-17 11:35:22

Windows 10功能

2011-11-03 16:09:36

2021-10-10 13:44:09

微信支付iPhone手機移動應用

2020-05-13 08:45:19

數據中心IT云服務

2020-05-18 09:43:53

數據中心云服務云計算

2020-06-28 14:51:15

容器Gartner軟件提供商

2022-07-05 08:05:00

策略模式接口實現類
點贊
收藏

51CTO技術棧公眾號

91sp网站在线观看入口| 懂色av蜜臀av粉嫩av分享吧最新章节| 秋霞一区二区| 欧美视频中文在线看| 日本在线播放一区| 99久久精品国产一区色| 国产欧美日韩一区二区三区在线| 国产亚洲免费的视频看| 在线免费黄色小视频| 女人让男人操自己视频在线观看 | 午夜视频一区| 日韩精品在线视频| 欧美精品 - 色网| 日韩理论视频| 亚洲乱码国产乱码精品精98午夜 | 97超碰人人在线| 成人午夜视频在线观看| 国产精品视频久久久| 国产 日韩 欧美 成人| 日韩欧美国产精品综合嫩v| 亚洲精品在线观看网站| 鲁一鲁一鲁一鲁一av| 91制片在线观看| 亚洲色图视频免费播放| 日韩精品欧美在线| 少妇一级淫片免费看| 激情综合网天天干| 国产97色在线| 99热国产在线观看| 黄色工厂这里只有精品| 久久精品小视频| 成人黄色免费网址| 欧美激情15p| 日韩欧美一区在线观看| 日本人69视频| 三级成人在线| 欧美日韩一区二区在线 | 国产自产高清不卡| 国产精品久久久久999| 欧美日韩精品区| 好看的亚洲午夜视频在线| 久久在线观看视频| 黄色录像免费观看| 国产精品久久占久久| 夜夜嗨av一区二区三区免费区| 玖草视频在线观看| 国产乱论精品| 亚洲国产精品va在看黑人| 中文写幕一区二区三区免费观成熟| 日本肉肉一区| 在线观看日韩av先锋影音电影院| 欧美性大战久久久久xxx | 中文av一区| 久久精品中文字幕电影| 女教师淫辱の教室蜜臀av软件| 国产探花一区在线观看| 伊人久久久久久久久久久久久| 级毛片内射视频| 国产亚洲一区| 伊人久久久久久久久久久| av在线播放中文字幕| 久久裸体网站| 久久夜色精品亚洲噜噜国产mv | 18禁一区二区三区| 97一区二区国产好的精华液| 精品成人佐山爱一区二区| 超碰caoprom| 欧美理伦片在线播放| 亚洲精品一区二区在线| 国产熟女一区二区| 欧美a级片视频| 久热99视频在线观看| 欧洲猛交xxxx乱大交3| 狠狠色丁香久久综合频道| 97视频在线观看亚洲| 国产精品第九页| 亚洲一区二区免费看| 国产成人精品免费视频| 在线视频欧美亚洲| 国产精品亚洲а∨天堂免在线| 都市激情久久久久久久久久久| 五月婷婷激情在线| 国产亚洲一区二区三区在线观看| 亚洲二区三区四区| 伊人春色在线观看| 黑人巨大精品欧美一区二区| 亚洲色精品三区二区一区| 亚洲国产伊人| 亚洲第一福利网站| 国产精品20p| 欧美女人交a| 日本精品中文字幕| 国产福利免费视频| 99久久综合国产精品| 亚洲欧美日韩精品久久久 | 日韩av日韩在线观看| 亚洲天堂手机在线| 国产精品996| 日韩精品另类天天更新| 男女视频在线| 欧美日韩一区二区三区视频| 国产又黄又嫩又滑又白| 国产99精品| 九九热这里只有在线精品视 | 91麻豆精品国产91久久久使用方法| 波多野结衣中文字幕在线播放| 婷婷精品在线观看| 久久在线观看视频| 欧美国产一级片| 成人午夜视频在线观看| 一区二区不卡在线观看| 美女福利一区二区三区| 日韩三级中文字幕| www亚洲色图| 日韩视频中文| 97超碰人人看人人 | 成人h动漫精品一区二区无码| xfplay精品久久| 精品国偷自产一区二区三区| 69堂免费精品视频在线播放| 亚洲国产欧美久久| 97成人资源站| 久久av老司机精品网站导航| 精品乱色一区二区中文字幕| 日韩电影免费观看| 欧美日韩dvd在线观看| 在哪里可以看毛片| 在线日本成人| 99在线观看| av在线app| 欧美日韩夫妻久久| 人妻一区二区视频| 天堂av在线一区| 久久久精彩视频| 国产美女一区视频| 91精品黄色片免费大全| 毛片视频免费播放| 视频一区二区中文字幕| 久久亚洲午夜电影| 欧美一级鲁丝片| 亚洲成人网久久久| 久久久无码一区二区三区| 国产精品18久久久久| 欧美与动交zoz0z| 亚洲午夜国产成人| 日韩中文字幕精品| 亚洲在线视频播放| 中文字幕亚洲区| 伊人影院综合在线| 久久国产亚洲精品| 国产欧美中文字幕| 久操视频在线观看| 91精品蜜臀在线一区尤物| www.5588.com毛片| 国产一区视频网站| 天堂av在线中文| 欧美成年网站| 久久久噜久噜久久综合| 天堂成人在线视频| 精品久久久精品| 亚洲a v网站| 三级久久三级久久久| 日韩免费电影一区二区三区| 国产黄色精品| 久久精品国产亚洲精品| 99精品免费观看| 亚洲18女电影在线观看| 亚洲第一黄色网址| 三级亚洲高清视频| 一区二区成人国产精品| 日韩中文字幕在线一区| 69精品小视频| av网站大全在线观看| 91精品国产综合久久精品图片| 欧美交换国产一区内射| 成av人片一区二区| 日本999视频| 91国语精品自产拍| 国产尤物99| 成人网ww555视频免费看| 久久久极品av| 日本毛片在线观看| 欧美在线观看视频一区二区| 中国毛片直接看| 不卡视频在线观看| www.99av.com| 亚洲无吗在线| 日韩影视精品| 国产视频网站一区二区三区| 96精品视频在线| 9191在线| 亚洲成人av中文字幕| 中文字幕一区二区免费| 亚洲主播在线播放| 天天舔天天操天天干| 国产91精品露脸国语对白| 国产一区亚洲二区三区| 亚洲成人精品| 欧美一区二区三区在线播放| 日本免费精品| 国产精品久久一区| 草草视频在线| 不卡中文字幕av| 国产一区二区三区福利| 日韩欧美你懂的| 中文字幕在线一| 精品日韩中文字幕| 久久精品视频免费在线观看| 国产日韩av一区| 星空大象在线观看免费播放| 国产一区二区三区蝌蚪| 91激情视频在线| 亚洲日韩视频| 伊人久久大香线蕉精品| 国内精品久久久久久99蜜桃| 国产日本一区二区三区| 精品视频在线观看免费观看| 国产成人一区三区| 无码小电影在线观看网站免费| 久热在线中文字幕色999舞| 国产九色在线| 精品视频www| 刘亦菲毛片一区二区三区| 4438x成人网最大色成网站| aaaaaa毛片| 精品国产乱码久久久久久虫虫漫画| www.xxxx日本| 国产精品久久三| 国产成人一区二区在线观看| 手机在线观看av| 国产亚洲欧美日韩美女| 水莓100国产免费av在线播放| 日韩欧美在线1卡| 国产露脸91国语对白| 欧美色区777第一页| 国内av在线播放| 欧美综合天天夜夜久久| 国产黄网在线观看| 色婷婷av一区二区三区之一色屋| 日韩免费观看一区二区| 午夜欧美一区二区三区在线播放| 精品一区二区三区人妻| 一区二区三区欧美亚洲| 久草免费新视频| 亚洲午夜国产一区99re久久| 免费无遮挡无码永久在线观看视频| 亚洲精品国产精品乱码不99| 久久久久久久久久网站| 悠悠色在线精品| 国产精品99re| 黑人极品videos精品欧美裸| 亚洲 欧美 成人| 在线观看三级视频欧美| 中文字幕+乱码+中文乱码www | 一本大道伊人av久久综合| 欧洲av在线精品| 亚洲一区二区人妻| 欧美福利一区二区| av中文字幕免费在线观看| 日韩三区在线观看| 午夜av免费观看| 亚洲色图偷窥自拍| 欧美69xxxx| 不卡av日日日| 爱啪视频在线观看视频免费| 欧美在线中文字幕| 欧美123区| 亚洲自拍另类欧美丝袜| 国产欧美自拍一区| 久久五月天婷婷| 欧美超碰在线| 欧美黑人在线观看| 久久xxxx精品视频| 伊人网在线综合| 丁香一区二区三区| 88久久精品无码一区二区毛片| 中文一区在线播放| 99视频只有精品| 欧美日韩一区二区三区在线免费观看 | 国产精品精品久久久| 国产日韩一区二区三免费高清| 国产精品久久久久久久久久久久冷| 啄木系列成人av电影| 中文有码久久| 99国产精品99久久久久久粉嫩| 老司机午夜av| 豆国产96在线|亚洲| 成人免费无遮挡无码黄漫视频| 中文字幕一区二区三区在线不卡 | 色美美综合视频| 99久久精品国产色欲| 日韩精品免费观看| 黄网页免费在线观看| 欧美一区亚洲一区| 国语精品视频| 日本一区高清不卡| 欧美日本不卡高清| 少妇黄色一级片| 成人av片在线观看| 亚洲欧美综合7777色婷婷| 午夜精品一区在线观看| 国产一区二区三区四区视频| 日韩极品精品视频免费观看| 麻豆tv在线| 国产成人aa精品一区在线播放| 亚洲精品v亚洲精品v日韩精品| 色吧亚洲视频| 午夜亚洲视频| av在线天堂网| 亚洲免费在线视频| 成人黄色免费网| 亚洲精品99久久久久| 中文字幕在线三区| 国产精品视频午夜| 亚洲自拍都市欧美小说| 日韩精品在线中文字幕| 国产在线一区观看| 婷婷综合在线视频| 欧美视频13p| 三级在线观看网站| 欧美成人午夜视频| **精品中文字幕一区二区三区| 欧美尤物一区| 99视频一区| www.四虎在线| 一区二区三区中文字幕精品精品| 亚洲综合精品视频| 尤物精品国产第一福利三区| 婷婷电影在线观看| 好吊妞www.84com只有这里才有精品| 一区二区三区四区在线观看国产日韩| 别急慢慢来1978如如2| 26uuu国产日韩综合| 性无码专区无码| 日韩av一区在线观看| 国模私拍一区二区国模曼安| 国产激情一区二区三区在线观看| 亚洲欧美日韩高清在线| 国产成年人视频网站| 中文字幕第一区第二区| 日本欧美www| 中文字幕在线日韩 | 久久青草久久| 91视频在线网站| 日本丰满少妇一区二区三区| 国产区av在线| 国产精品无码专区在线观看| 日本a口亚洲| 中文字幕久久av| 亚洲男同1069视频| 亚洲av无码乱码在线观看性色| 欧美乱妇高清无乱码| 6080亚洲理论片在线观看| 国产成人一二三区| 成人污视频在线观看| 日本熟妇毛耸耸xxxxxx| 精品一区二区三区三区| 久久久人成影片一区二区三区在哪下载 | 99re在线视频| 成人国产精品日本在线| 你懂的视频一区二区| 国产精品一区二区人妻喷水| 午夜av一区二区| 黄色小视频在线观看| 国产精品一区专区欧美日韩| 亚洲九九视频| 日本三级日本三级日本三级极| 精品国产91久久久久久| wwwww在线观看免费视频| 成人久久18免费网站图片| 欧美日韩国产欧| 噜噜噜在线视频| 欧美日韩国产123区| 超黄网站在线观看| 日本一区高清不卡| 国产九色精品成人porny| 亚洲欧美在线视频免费| 亚洲最新av网址| 免费精品一区| www一区二区www免费| 国产精品美女久久久久久2018 | 盗摄精品av一区二区三区| 日本在线播放视频| 色噜噜狠狠色综合网图区| 国产精品天天看天天狠| 少妇人妻互换不带套| 伊人婷婷欧美激情| 精品乱码一区二区三四区视频 | 人成免费电影一二三区在线观看| 国产精品免费看久久久香蕉| 欧美精品91| 第一次破处视频| 精品久久免费看| 欧美日韩尤物久久| 国产av熟女一区二区三区| 中文字幕欧美日韩一区| 日韩一卡二卡在线| 国产日韩中文在线| 久久都是精品| 久久成人在线观看|