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

攤牌了!策略模式在項目設計中用的多嗎?

開發 項目管理
日常 Coding 過程中,設計模式三板斧:模版、構建者、策略,今天來說下第三板斧 策略設計模式。

[[381856]]

本文轉載自微信公眾號「源碼興趣圈」,作者龍臺。轉載本文請聯系源碼興趣圈公眾號。  

日常 Coding 過程中,設計模式三板斧:模版、構建者、策略,今天來說下第三板斧 策略設計模式

策略模式還是比較簡單并且使用較多的,平常我們多運用策略模式用來消除 if-else、switch 等多重判斷的代碼,消除 if-else、switch 多重判斷 可以有效應對代碼的復雜性,使設計解耦

如果分支判斷會不斷變化(增、刪、改),那么可以使用技巧讓策略模式滿足開閉原則,提高代碼的擴展性 (策略模式場景主要負責解耦,開閉原則需要額外支持)

下文中會詳細列舉如何使用設計模式做個 Demo 、模式的真實場景以及策略模式的好處

策略設計模式大綱如下:

  1. 什么是策略模式
  2. Spring 項目中真實的應用場景
  3. 框架源碼底層如何玩耍策略模式
  4. 策略模式總結

什么是策略模式

策略模式在 GoF 的《設計模式》一書中,是這樣定義的:

Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it.

定義一組算法類,將每個算法分別封裝起來,讓它們可以互相替換。策略模式使這些算法在客戶端調用它們的時候能夠互不影響地變化,客戶端代指使用算法的代碼

看到上面的介紹可能不太明白策略模式具體為何物,這里會從最基本的代碼說起,一步一步徹底掌握此模式。下述代碼可能大家都能聯想出對應的業務,根據對應的優惠類型,對價格作出相應的優惠

 

這段代碼是能夠滿足項目中業務需求的,而且很多已上線生產環境的代碼也有這類代碼。但是,這一段代碼存在存在兩個弊端

  1. 代碼的復雜性,正常業務代碼邏輯肯定會比這個代碼塊復雜很多,這也就 導致了 if-else 的分支以及代碼數量過多。這種方式可以通過將代碼拆分成獨立函數或者拆分成類來解決
  2. 開閉原則,價格優惠肯定會 隨著不同的時期作出不同的改變,或許新增、刪除或修改。如果在一個函數中修改無疑是件恐怖的事情,想想可能多個開發者分別進行開發,雜亂無章的注釋,混亂的代碼邏輯等情況十有八九會發生

如何運用策略模式優化上述代碼,使程序設計看著簡約、可擴展等特性

簡化代碼的復雜性,將不同的優惠類型定義為不同的策略算法實現類

保證開閉原則,增加程序的健壯性以及可擴展性

策略模式示例

將上述代碼塊改造為策略設計模式,大致需要三個步驟

  1. 定義抽象策略接口,因為業務使用接口而不是具體的實現類的話,便可以靈活的替換不同的策略
  2. 定義具體策略實現類,實現自抽象策略接口,其內部封裝具體的業務實現
  3. 定義策略工廠,封裝創建策略實現(算法),對客戶端屏蔽具體的創建細節

 

目前把抽象策略接口、具體的策略實現類以及策略工廠都已經創建了,現在可以看一下客戶端需要如何調用,又是如何對客戶端屏蔽具體實現細節的

 

根據代碼塊圖片得知,具體策略類是從策略工廠中獲取,確實是取消了 if-else 設計,在工廠中使用 Map 存儲策略實現。獲取到策略類后執行具體的優惠策略方法就可以獲取優惠后的金額

通過分析大家得知,目前這種設計確實將應用代碼的復雜性降低了。如果新增一個優惠策略,只需要新增一個策略算法實現類即可。但是,添加一個策略算法實現,意味著需要改動策略工廠中的代碼,還是不符合開閉原則

如何完整實現符合開閉原則的策略模式,需要借助 Spring 的幫助,詳細案例請繼續往下看

項目中真實的應用場景

最近項目中設計的一個功能用到了策略模式,分為兩類角色,筆者負責定義抽象策略接口以及策略工廠,不同的策略算法需要各個業務方去實現,可以聯想到上文中的優惠券功能。因為是 Spring 項目,所以都是按照 Spring 的方式進行處理,話不多說,上代碼

 

可以看到,比對上面的示例代碼,有兩處明顯的變化

  1. 抽象策略接口中,新定義了 mark() 接口,此接口用來標示算法的唯一性
  2. 具體策略實現類,使用 @Component 修飾,將對象本身交由 Spring 進行管理

小貼士:為了閱讀方便,mark() 返回直接使用字符串替代,讀者朋友在返回標示時最好使用枚舉定義

接下來繼續查看抽象策略工廠如何改造,才能滿足開閉原則

 

和之前 責任鏈模式 相同,都是通過 InitializingBean 接口實現中調用 IOC 容器查找對應策略實現,隨后將策略實現 mark() 方法返回值作為 key, 策略實現本身作為 value 添加到 Map 容器中等待客戶端的調用

 

這里使用的 SpringBoot 測試類,注入策略工廠 Bean,通過策略工廠選擇出具體的策略算法類,繼而通過算法獲取到優惠后的價格。小插曲:如果不想把策略工廠注入 Spring 也可以,實現方法有很多

總結下本小節,我們通過和 Spring 結合的方式,通過策略設計模式對文初的代碼塊進行了兩塊優化:應對代碼的復雜性,讓其滿足開閉原則。更具體一些呢就是 通過抽象策略算法類減少代碼的復雜性,繼而通過 Spring 的一些特性同時滿足了開閉原則,現在來了新需求只要添加新的策略類即可,健壯易擴展

源碼底層如何耍策略模式

自己用肯定覺得不夠,必要時候還得看看設計開源框架源碼的大佬們如何在代碼中運用策略模式的

在作者了解中,JDK、Spring、SpringMvc、Mybatis、Dubbo 等等都運用了策略設計模式,這里就以 Mybatis 舉例說明

Mybatis 中 Executor 代表執行器,負責增刪改查的具體操作。其中用到了兩種設計模式,模版方法以及策略模式

 

Executor 代表了抽象策略接口,剛才說到的模版方法模式源自 BaseExecutor

Configuration 代表策略工廠,負責創建具體的策略算法實現類

SimpleExecuto、ReuseExecutor... 表示封裝了具體的策略算法實現類

 

上述代碼塊發生在 Configuration 類中創建執行器 Executor,通過 executorType 判斷創建不同的策略算法。

上述代碼塊并沒有徹底消除 if-else,因為 Mybatis 中執行器策略基本是固定的,也就是說它只會有這些 if-else 判斷,基本不會新增或修改。如果非要消除 if-else,可以這么搞,這里寫一下偽代碼

 

這種方式叫做 "查表法",通過策略工廠實現消除 if-else 分支。最后,Mybatis 太過詳細的設計這里不再贅述,有興趣的小伙伴可以去把源碼下載啃一啃

到了這里可能有讀者看出了問題,策略模式就算消除了 if-else 但是如果添加新的策略類,不還是會違反開閉原則么?

沒錯,因為 Mybatis 本身沒有引入 Spring 依賴,所以沒有辦法借助 IOC 容器實現開閉原則。Spring 是一種開閉原則解決方式,那還有沒有別的解決方式?

解決方式有很多,開閉原則核心就是 對原有代碼修改關閉,對新增代碼開放。可以通過掃描指定包下的自定義注解亦或者通過 instanceof 判斷是否繼承自某接口都可以。不過, 項目如果用了 Spring 還是消停的吧

結言

文章中圖文并茂的方式介紹策略模式,通過價格優惠的場景,進而引用本文的重點:策略設計模式,相信小伙伴看完后都會有一定的收獲

策略模式的本質依然是對代碼設計解耦合,通過三類角色貫穿策略模式:抽象策略接口、策略工廠以及具體的策略實現類。通過細粒度的策略實現類避免了主體代碼量過多,減少了設計中的復雜性。并通過開閉原則特性,添加新策略時可以保證最小、集中化修改代碼

作者聽到過很多小伙伴覺得自己做的都是 CRUD 工作,沒有挑戰性沒意思。其實,我想說的是:業務代碼一樣牛逼,一樣能體現程序員的水平。不一定非要高并發、大數據等場景。頗有一屋不掃何以掃天下的意思

最后拋出一個問題:出現 if-else 的代碼,一定要使用策略模式優化么

如果 if-else 判斷分支不多并且是固定的,后續不會出現新的分支,那我們完全 可以通過抽函數的方式降低程序復雜性;不要想法設法去除 if-else 語句,存在即合理。而且,使用策略模式會導致類增多,沒有必要為了少量的判斷分支引入策略模式

關于策略設計模式本文就講到這里,后面會陸續輸出工廠、原型、享元等模式;如果文章對你有幫助那就點個關注支持下吧,祝好。

文章參考:《設計模式之美:策略模式》

責任編輯:武曉燕 來源: 源碼興趣圈
相關推薦

2022-10-30 17:32:25

設計模式單例模式

2017-07-07 10:55:14

數據庫MongoDB設計模式

2013-11-26 16:09:34

Android設計模式

2012-08-30 09:07:33

設計模式

2021-06-09 08:53:34

設計模式策略模式工廠模式

2015-09-08 13:39:10

JavaScript設計模式

2022-09-21 09:01:27

Spring設計模式框架,

2021-06-08 07:04:46

Dubbo設計模式

2022-05-13 07:26:28

策略模式設計模式

2024-10-06 12:56:36

Golang策略設計模式

2025-06-30 00:32:43

策略模式算法MyBatis

2014-12-29 10:39:16

JS

2024-01-29 12:22:07

設計模式策略模式

2020-10-26 13:42:28

Python算法垃圾

2014-03-11 10:03:25

設計模式

2017-03-20 18:03:51

2021-05-17 14:57:23

策略模式代碼

2024-08-12 08:15:46

2025-03-26 00:03:00

Go設計模式

2021-11-22 08:00:00

Kubernetes容器集群
點贊
收藏

51CTO技術棧公眾號

丝袜亚洲精品中文字幕一区| 亚洲国产精品无码av| 欧美成人黑人猛交| 第一页在线观看| 极品av少妇一区二区| 91精品国产黑色紧身裤美女| 久久99久久99精品| 天堂网在线播放| 欧美日本中文| 亚洲人av在线影院| 中文字幕一二三区| 韩日精品一区二区| 亚洲精品成人在线| 日韩久久不卡| 俄罗斯嫩小性bbwbbw| 久久一区国产| 久久久久在线观看| 亚洲精品永久免费| 国产日韩在线一区| 久久精品免费在线| 精品国产中文字幕第一页| 日韩写真欧美这视频| 国产真实乱子伦| xxxx日本少妇| 免费萌白酱国产一区二区三区| 在线观看一区不卡| 国产av人人夜夜澡人人爽麻豆| 91高清在线| 99re这里只有精品视频首页| 成人黄色免费片| 久久久久亚洲av成人毛片韩| 午夜日本精品| 日韩综合视频在线观看| 30一40一50老女人毛片| 日韩区一区二| 91麻豆精品国产91久久久使用方法 | 欧美xxxx做受欧美88bbw| 欧美国产一区视频在线观看| 国产日韩二区| 亚洲xxxx天美| 国产精品中文字幕日韩精品| 亚洲3p在线观看| 99精品视频播放| 欧洲性视频在线播放| 国产精品久久久久久亚洲伦| 看欧美日韩国产| 成人毛片视频免费看| 国产一区二区三区黄视频 | 日韩最新中文字幕| 国产主播福利在线| 久久亚洲春色中文字幕久久久| 亚洲在线一区二区| 国产孕妇孕交大片孕| 蜜臀av亚洲一区中文字幕| 四季av一区二区| 91激情在线观看| 久热精品在线| 欧美怡春院一区二区三区| 久久高清免费视频| 一区二区视频欧美| 午夜精品在线视频| 欧美亚洲天堂网| 日韩欧美电影在线观看| 国产精品自拍毛片| 亚洲综合精品一区二区| 99久久久久久久| 国产伦精一区二区三区| 99c视频在线| 亚洲成人久久精品| www.亚洲在线| 久久99热只有频精品91密拍| 日本福利片在线| 欧美激情一区二区三区蜜桃视频| 四虎影视永久免费在线观看一区二区三区 | 国产成人av免费观看| 欧美国产中文高清| 精品久久久网站| japanese在线观看| 国产午夜一区| 久久精品一偷一偷国产| 久久免费小视频| 国产精品尤物| 国产精品中文久久久久久久| 国产特级aaaaaa大片| 成人性生交大合| 麻豆一区区三区四区产品精品蜜桃| 手机亚洲第一页| 欧美激情一区不卡| a级片一区二区| 国产777精品精品热热热一区二区| 色综合夜色一区| 超碰超碰在线观看| 成人性生交大片免费看中文视频| 中文字幕视频一区二区三区久| 最近2019年日本中文免费字幕| 99久久精品免费视频| 日韩激情在线| 欧美成人全部免费| 午夜影院免费在线观看| 久久er99精品| 国产一区二区三区高清| 国产伦理在线观看| 欧美绝顶高潮抽搐喷水合集| 伊人精品在线观看| 久久久久久久久久91| 香蕉av777xxx色综合一区| 国产日本欧美一区| 欧美熟妇另类久久久久久不卡 | 911国产网站尤物在线观看| 在线观看污污网站| 国产成人小视频| 日本精品一区二区三区不卡无字幕| 超碰在线无需免费| 色婷婷国产精品综合在线观看| 色呦色呦色精品| 欧美成人午夜77777| 精品国产欧美一区二区三区成人| 国产成人免费看| 国产激情一区二区三区| 色狠狠久久av五月综合| 俺来俺也去www色在线观看| 欧美偷拍一区二区| 亚洲色图14p| 亚洲精品a级片| 国产精品久久久久久亚洲调教| 人妻夜夜爽天天爽| 亚洲日本一区二区三区| 黄色免费网址大全| 欧美中文一区| 欧美激情女人20p| 91豆花精品一区| 一级做a爱片性色毛片| 成人高清视频在线观看| 美国av在线播放| 国产亚洲一区二区手机在线观看| 亚洲成年网站在线观看| 欧美久久久久久久久久久久| 另类中文字幕网| 视频一区三区| 成人va天堂| 亚洲精品视频网上网址在线观看 | 国产精品久久久久精k8| 极品美女扒开粉嫩小泬| 午夜电影一区| 欧美成人全部免费| 亚洲成a人片77777精品| 一级日本不卡的影视| 中文字幕在线视频一区二区| 99精品综合| 91精品国产综合久久香蕉最新版 | 亚洲精品99999| 国产精品久久久精品四季影院| 蜜臀a∨国产成人精品| 欧美日韩亚洲一区二区三区四区| 国产午夜性春猛交ⅹxxx| 国产在线国偷精品产拍免费yy| 色偷偷91综合久久噜噜| 久久久久久久久久综合| 国产精品一区二区无线| 女人被男人躁得好爽免费视频| 国产毛片av在线| 欧日韩精品视频| 久久久国产一级片| 久久国产精品色| 国产免费色视频| 欧美日韩国产一区二区在线观看| 国产婷婷97碰碰久久人人蜜臀| 久久久无码精品亚洲国产| 国产一区二区三区四区在线观看| 欧美日本亚洲| 国产一区二区色噜噜| 久久精品国产电影| 亚洲av无码乱码国产精品久久| 亚洲国产另类精品专区| 亚洲欧美色图视频| 视频一区在线播放| 日本丰满少妇黄大片在线观看| 日韩免费成人| 热re99久久精品国产66热| 91精彩视频在线观看| 91精品国产色综合久久| 日韩精品―中文字幕| 蜜臀av免费一区二区三区| 国产乱人伦真实精品视频| 免费观看av网站| 最新超碰在线| 在线区一区二视频| 亚洲人成人无码网www国产 | 欧美激情图片区| 四虎在线免费看| 精品视频一区二区三区免费| 亚洲成a人无码| 国产精品午夜av| 国产精品亚发布| 精品黑人一区二区三区观看时间| 成人久久综合| 91九色综合久久| 91九色porn在线资源| 天天影视网天天综合色在线播放| 久久成人这里只有精品| 中文在线免费观看| 亚洲综合偷拍欧美一区色| 久久久久久久久久久国产精品| 美女网站色91| 国产真人做爰毛片视频直播| 精品国产一区二区三区| 亚洲精品中文在线| 欧美 亚洲 视频| 好看的中文字幕在线播放| 亚洲天堂网站在线观看视频| 一卡二卡在线观看| 欧美日韩一二三四五区| tube国产麻豆| 亚洲毛片播放| 97超碰资源| av亚洲一区| 日韩在线精品视频| 无码国产精品一区二区色情男同 | 国产ktv在线视频| 久久精品成人一区二区三区 | 亚洲国产精品成人| 欧美成人免费全部观看天天性色| 91免费视频播放| 在线免费av一区| 国产系列精品av| 亚洲男人的天堂av| 国产小视频你懂的| 久久免费视频一区| 亚洲黄色免费在线观看| 国产精品一区二区果冻传媒| 亚洲无吗一区二区三区| 久久久久免费| 久久婷婷国产精品| 成人免费无遮挡| 麻豆久久久久久| 性欧美办公室18xxxxhd| 亚洲免费视频一区二区三区| 欧美日韩一二区| 亚洲国产美女视频| 国产精品久久久久久久久免费丝袜 | 国产综合亚洲精品一区二| 亚洲一区免费看| 日韩精品网站| 亚洲欧美日韩在线综合| 蜜臀av免费一区二区三区| 蜜桃传媒视频麻豆第一区免费观看 | 三级视频网站在线| 精品欧美一区二区在线观看| 午夜美女福利视频| 欧美大肚乱孕交hd孕妇| 国产精品尤物视频| 欧美专区日韩专区| 五月综合色婷婷| 亚洲精品乱码久久久久久黑人 | 91欧美日韩| 亚洲第一精品区| 91欧美在线| 中文字幕色呦呦| 欧美日韩18| 情事1991在线| 国产一级aa大片毛片| 高清不卡在线观看| 国产xxxx视频| 麻豆精品精品国产自在97香蕉 | 国产麻豆精品95视频| 欧美69精品久久久久久不卡| 日本亚洲最大的色成网站www| 欧美综合在线观看视频| 老鸭窝亚洲一区二区三区| 黄网站欧美内射| 免费看亚洲片| 91 在线视频观看| 国产精品原创巨作av| 看全色黄大色黄女片18| 久久丝袜美腿综合| 伊人精品视频在线观看| 国产成人福利片| 女尊高h男高潮呻吟| 国产日韩av在线播放| 国产女主播在线直播| 精品美女被调教视频大全网站| 成人小说亚洲一区二区三区| 五月婷婷激情综合| 国产亚洲精品码| 欧美日韩精品在线观看| 久久精品偷拍视频| 91精品在线免费| 日韩一区二区电影在线观看| 91超碰在线免费| 日本免费久久高清视频| 欧美啪啪网站| 国产九区一区在线| 欧美男同视频网| 六月婷婷激情网| 亚洲私人影院| 国产黄色特级片| 国产一区二区精品久久99| 日本护士做爰视频| 国产精品护士白丝一区av| 美国黄色小视频| 一本色道亚洲精品aⅴ| 亚洲第一精品在线观看 | 日本香蕉视频在线观看| 五月天久久777| 波多野结衣乳巨码无在线| 精品一区二区在线免费观看| 日韩aaaaa| 久久精品一区二区三区av| 国产成人精品视频免费| 亚洲一区中文日韩| 一本色道久久综合亚洲| 日韩av中文字幕在线播放| 国产激情视频在线| 国产激情999| 久久久久高潮毛片免费全部播放| 伊人久久婷婷色综合98网| 亚洲综合好骚| 极品人妻一区二区| 国产精品毛片高清在线完整版| 一区二区三区视频免费看| 日韩一区国产二区欧美三区| 成年人在线视频| 欧美一区二区三区图| 在线播放一区二区精品视频| 艳色歌舞团一区二区三区| 久久精品官网| 少妇一级淫免费观看| 一区二区在线观看av| 91久久久久久久久久久久| 亚洲人在线视频| 欧亚在线中文字幕免费| 国产亚洲欧美一区二区| 亚洲二区在线| 性感美女一区二区三区| 一区二区三区欧美| 一区二区三区亚洲视频| 色青青草原桃花久久综合| 日韩精品一区二区三区av| 国内视频一区二区| 亚洲黄色影片| 少妇献身老头系列| 一区二区三区中文字幕电影| 国产露脸91国语对白| 久久精品亚洲热| 欧洲亚洲精品| 天堂av一区二区| 久久久久99| 舐め犯し波多野结衣在线观看| 色综合久久99| 国产毛片在线| 亚洲欧洲国产精品| 亚洲 小说区 图片区| 日韩高清中文字幕| 乱人伦视频在线| 激情伦成人综合小说| 激情亚洲成人| 亚洲色偷偷色噜噜狠狠99网| 亚洲午夜久久久久久久久久久| 性猛交富婆╳xxx乱大交天津| 九九久久久久久久久激情| 少妇精品在线| www.日本三级| 岛国毛片av在线| 国产高清一区视频| 亚洲人成毛片在线播放女女| 国产真实乱人偷精品| 婷婷夜色潮精品综合在线| 神马电影在线观看| 国产精品久久91| 国产精品精品| 911亚洲精选| 精品久久久久久久久久久| 蝌蚪视频在线播放| 国产精品亚洲自拍| 欧美日韩理论| 污污内射在线观看一区二区少妇 | 在线不卡日本| 国产精品影视天天线| 日韩黄色三级视频| 国产亚洲精品高潮| www.欧美视频| 国产精品久久中文字幕| 久久久久久久国产精品影院| 一区二区久久精品66国产精品| 欧美日韩国产成人在线| 亚洲精品小区久久久久久| 一道本在线免费视频| 亚洲卡通动漫在线| 青青草娱乐在线| 91久久久久久国产精品| 一本久道久久综合狠狠爱| 国产欧美小视频| 精品国产一区二区三区四区四| 欧美日韩国产v| 玖玖精品在线视频| 国产午夜精品久久| 国模无码一区二区三区| 国产精品三级美女白浆呻吟 | 国产精品久久久久久久久久久久久久久久| 精品综合久久久久久97|