精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

天天影视天天精品| 青草视频在线免费直播| 日韩精品成人一区二区三区| 国产亚洲精品久久久| 91极品尤物在线播放国产| 伊人在线视频| 成人av在线网| 国产精品69久久| 一区视频免费观看| 好吊妞国产欧美日韩免费观看网站 | 日本欧美国产在线| 污污的视频在线免费观看| 欧洲精品一区| 欧美一区二区三区在线观看视频 | 亚洲女人毛茸茸高潮| 99这里只有精品视频| 欧美亚洲动漫另类| 日韩黄色短视频| 成人免费一区二区三区视频网站| 国产精品77777| 国产福利视频一区二区| 国产在线视频在线观看| 久久国产小视频| 亚洲精品短视频| 国产黄色一区二区三区 | 成人久久一区二区| 久草视频一区二区| 亚洲调教视频在线观看| 亚洲欧洲在线播放| 强迫凌虐淫辱の牝奴在线观看| 欧美成a人片在线观看久| 夜夜爽夜夜爽精品视频| 亚洲欧美日韩精品综合在线观看| 日本午夜在线| 成人av在线资源| 国产91一区二区三区| 最新国产中文字幕| 久久性天堂网| 青青a在线精品免费观看| 国产一级久久久| 欧美三级网页| 伦伦影院午夜日韩欧美限制| 成人精品一二三区| 国产精品午夜一区二区三区| 亚洲国产欧美日韩精品| 波多野结衣电影免费观看| 日韩毛片免费视频一级特黄| 日本韩国一区二区| 欧美v在线观看| 国产精选在线| 欧美日韩亚洲高清| 男人c女人视频| 最新av在线播放| 亚洲视频一区二区免费在线观看| 亚洲欧洲三级| 阿v免费在线观看| 中文久久乱码一区二区| 视频一区亚洲| 3p在线观看| 日韩毛片精品高清免费| 椎名由奈jux491在线播放 | 亚洲欧美怡红院| 一区精品视频| 国产盗摄在线观看| 亚洲自拍偷拍麻豆| 日韩中字在线观看| 亚洲涩涩在线| 欧美性猛交xxxx黑人交| 色乱码一区二区三区在线| 精品久久99| 日韩一级完整毛片| jjzz黄色片| 日韩超碰人人爽人人做人人添| 日韩经典一区二区三区| 欧美成人午夜精品免费| 狠狠综合久久av一区二区蜜桃| 在线播放国产一区中文字幕剧情欧美 | 欧美日韩一级黄色片| 性色一区二区| 国产精自产拍久久久久久| 99热这里只有精品3| 国产91丝袜在线播放0| 亚洲综合免费观看高清完整版在线| 国产视频精品久久久| 精品人伦一区二区三电影| 欧美电影一区| 久久久免费观看视频| 久草视频一区二区| 精品伊人久久久久7777人| 国产69精品久久久久9999apgf| 无码精品在线观看| 国产片一区二区| 亚洲国产一二三精品无码| 女人高潮被爽到呻吟在线观看| 精品国产精品三级精品av网址| 免费男同深夜夜行网站 | 色8久久人人97超碰香蕉987| 欧美在线aaa| 精品亚洲自拍| 在线视频欧美日韩| 久久机热这里只有精品| 日韩在线观看一区二区| 亚洲字幕一区二区| 男人的天堂在线| 亚洲精品中文字幕在线观看| 国产肥臀一区二区福利视频| www.成人在线.com| 日韩电影大片中文字幕| frxxee中国xxx麻豆hd| 国产亚洲毛片在线| 亚洲最大av在线| 国产色在线 com| 亚洲一区二区三区四区中文字幕| 黄色在线视频网| 美女av一区| 欧美成人免费全部| 自拍偷拍18p| av在线播放一区二区三区| 亚洲一区三区| 3d欧美精品动漫xxxx无尽| 精品日韩av一区二区| 欧美艳星brazzers| 精品国产aⅴ一区二区三区东京热| 在线看成人短视频| 欧美丰满少妇xxxxx| 中文字幕理论片| 涩涩网在线视频| 精品视频1区2区3区| 欧美 变态 另类 人妖| 欧美精品黄色| 91九色蝌蚪国产| 国产福利一区视频| 成人国产精选| 亚洲欧美激情四射在线日| 久久久久久久久精| 韩国理伦片一区二区三区在线播放| 欧美日韩一区二区三区在线观看免| 在线免费看v片| 久久91成人| 91精品国产91久久久久久| www.av在线.com| 亚洲欧美一区二区三区久本道91 | 国产免费999| 国产精品传媒| 欧美国产精品日韩| 三级在线免费观看| 精品国产第一福利网站| 日韩电影免费观看在线观看| 日本网站免费观看| 成人精品免费视频| 秋霞无码一区二区| 一级片视频在线观看| 国产91富婆露脸刺激对白| 992tv成人免费观看| 国产精品1区| 色综合色综合久久综合频道88| 国产露脸91国语对白| 亚洲手机成人高清视频| 不卡的一区二区| 91精品91| 蜜臀av性久久久久av蜜臀妖精 | 欧美mv日韩mv国产网站| 国产高清在线免费观看| 国产精品小仙女| 精品少妇人欧美激情在线观看| 一区二区日韩| 992tv在线成人免费观看| 亚洲欧美日韩动漫| 欧美性感一类影片在线播放| 免费看日本黄色片| 极品少妇xxxx偷拍精品少妇| 国产精品啪啪啪视频| 91麻豆精品激情在线观看最新 | 黄色一级片av| 91在线一区| 欧洲日韩成人av| 黄色网址视频在线观看| 欧美一级爆毛片| 国产在线精品观看| 久久久久国产精品人| 日本一二区免费| 亚洲无吗在线| 视频一区视频二区视频| 亚洲专区**| 日本久久亚洲电影| 成人在线免费看片| 日韩av综合网| 亚洲最大成人网色| 亚洲精品一区二区三区蜜桃 | 免费观看成人毛片| 国产嫩草影院久久久久| 国产在线观看中文字幕| 99人久久精品视频最新地址| 亚洲精品欧美精品| 综合激情五月婷婷| 国产精品第一视频| 污视频在线免费观看网站| 日韩精品一二三四区| 中文字幕有码视频| 亚洲h在线观看| 日韩av网站在线播放| 波多野结衣一区二区三区| 激情五月俺来也| 亚洲一区二区三区高清| 特级黄色录像片| 在线看成人短视频| 国产精品视频在线免费观看| 久久精品国产福利| 97成人在线视频| 永久免费网站在线| 国产一区二区黑人欧美xxxx| 亚洲免费不卡视频| 7777精品伊人久久久大香线蕉最新版| 国产情侣在线视频| 亚洲摸摸操操av| 日本一道本视频| 99re这里只有精品首页| 色姑娘综合天天| 免费成人av资源网| 男人的天堂99| 尤物在线精品| 一卡二卡三卡日韩欧美| 黄色av免费在线播放| 亚洲特级毛片| 久久久久久久久影视| 欧美xxxxx视频| 日本不卡高清视频一区| 久久97精品| 国产 高清 精品 在线 a | 古典武侠综合av第一页| 亚洲午夜剧场| 国产欧美精品一区二区三区介绍| 日本在线影院| 久久全球大尺度高清视频| 黄色成年人视频在线观看| 中文字幕欧美在线| 国产区av在线| 亚洲欧美日韩精品| 你懂的在线视频| 日韩成人在线免费观看| 蜜桃久久一区二区三区| 欧美成人乱码一区二区三区| 精品人妻无码一区二区| 4438亚洲最大| 中文字幕在线观看精品| 精品久久久一区| 日韩大片免费在线观看| 亚洲尤物视频在线| 不卡的免费av| 亚洲高清免费观看高清完整版在线观看| 成人免费毛片东京热| 一区二区三区成人| 国产一级大片在线观看| 午夜免费久久看| 黄色大片网站在线观看| 欧美性猛交xxxx乱大交| www毛片com| 欧美亚洲一区二区在线观看| 伊人精品在线视频| 7777精品伊人久久久大香线蕉| 一区二区三区黄色片| 欧美一卡二卡三卡四卡| 精品人妻少妇AV无码专区| 精品999在线播放| 欧美少妇另类| 伊人亚洲福利一区二区三区| av亚洲在线| 久久久精品999| 在线免费观看a视频| 欧美激情精品久久久久久| 日本在线啊啊| 国产精品一区二区三区免费视频 | 欧美激情第六页| 精品国产一区二区三区香蕉沈先生| 日本一区二区三区视频在线观看| 成人精品影视| 老司机激情视频| 午夜亚洲激情| 香蕉视频999| 成人一区二区三区视频在线观看| 国产精品一级黄片| 蜜桃视频在线观看www社区| 久久久久久久综合日本| 特级西西人体wwwww| 久久久美女毛片| 亚洲色图27p| 欧美久久久网站| 国产精品久久二区| 视频精品国内| 久久综合伊人77777麻豆| 色综合天天爱| 国产av人人夜夜澡人人爽麻豆 | 欧美a级免费视频| 夜夜嗨一区二区| 天天干天天爽天天射| 国产精品一二三四五| 久久国产精品影院| 亚洲精品国产a| 中文字幕xxxx| 日韩欧美色电影| 国产对白叫床清晰在线播放| 美日韩精品免费视频| 欧美xxxxxx| 成人永久免费| 日韩精品看片| 欧美精品一区免费| 国产精品主播直播| www色com| 婷婷成人激情在线网| 97人妻人人澡人人爽人人精品| 欧美精品一区视频| 免费av在线播放| 国产成人精彩在线视频九色| 日韩08精品| 亚洲国产精品久久久久婷婷老年 | 97香蕉久久超级碰碰高清版| 婷婷久久免费视频| 欧美精品一区二区视频| 欧美日韩1区| 三区视频在线观看| 国产欧美综合在线观看第十页| 日本一区二区欧美| 日韩一区二区精品葵司在线| yiren22综合网成人| 91精品国产91| 成人免费在线电影网| 麻豆md0077饥渴少妇| 精品久久久久久久久久久国产字幕| 久久久91精品国产一区二区精品| 激情四射综合网| 欧美日韩中文一区| 日本天堂在线| 国外成人免费在线播放 | 欧美国产91| 免费看涩涩视频| 久久av中文| 久久这里只有精品18| 国产尤物一区二区在线| 蜜桃av免费观看| 精品视频在线免费观看| 韩日视频在线| 欧美综合在线观看| 日韩母乳在线| 日韩欧美一区二| 99视频精品在线| 国产无套在线观看| 亚洲第一区第二区| 97超碰免费在线| 国内精品**久久毛片app| 伊人久久综合| 中文字幕一区二区久久人妻网站| 精品高清美女精品国产区| 三级网站免费观看| 欧美亚洲国产日本| 亚洲图区在线| 日韩免费高清在线| 欧美激情一区三区| 亚洲无码精品在线观看| 精品久久久999| 久久伊人影院| 超碰成人免费在线| 99精品久久只有精品| 国产亚洲欧美在线精品| 亚洲午夜久久久影院| 成人精品电影在线| 亚洲欧美成人一区| 国产精品香蕉一区二区三区| 久青草免费视频| 精品亚洲一区二区三区四区五区 | 狠狠色丁香久久综合频道| 久久精品无码专区| 日韩人在线观看| 又爽又大又黄a级毛片在线视频| 91精品免费看| 亚洲视频综合| 精品人伦一区二区| 欧美一区二区三区视频在线| а√天堂中文资源在线bt| 国产无套精品一区二区| 久久久国产精品一区二区中文| 国产又黄又粗又猛又爽的| 日韩视频免费直播| 樱花草涩涩www在线播放| 亚洲国产精品一区二区第一页| 韩国av一区二区三区在线观看| 久久精品视频免费在线观看| 亚洲精品福利免费在线观看| 国产成人毛片| 国产女教师bbwbbwbbw| 久久久精品tv| www香蕉视频| 国产成人精品午夜| 欧美日韩视频| 老头老太做爰xxx视频| 精品国产一区二区三区久久影院| 欧美aaa视频| 黄色一级视频在线播放| 中文字幕av一区二区三区| 色综合视频在线| 91精品视频网站|