国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

為什么我不再推薦枚舉策略模式?

jf_ro2CN3Fa ? 來源:芋道源碼 ? 2023-04-14 10:52 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群


一、為什么講策略模式

策略模式,應該是工作中比較常用的設計模式,調用方自己選擇用哪一種策略完成對數據的操作,也就是“一個類的行為或其算法可以在運行時更改”

我個人的理解是 將一些除了過程不同其他都一樣的函數封裝成策略,然后調用方自己去選擇想讓數據執行什么過程策略。常見的例子為根據用戶分類推薦不同的排行榜(用戶關注點不一樣,推薦榜單就不一樣)

和單例模式一樣,隨著時間發展,我不再推薦經典策略模式,更推薦簡單策略用枚舉策略模式,復雜地用工廠策略模式。下面引入一個例子,我們的需求是:對一份股票數據列表,給出低價榜、高價榜、漲幅榜。這其中只有排序條件的區別,比較適合作為策略模式的例子

基于 Spring Boot + MyBatis Plus + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

  • 項目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 視頻教程:https://doc.iocoder.cn/video/

二、經典策略模式

數據DTO

@Data
publicclassStock{

//股票交易代碼
privateStringcode;

//現價
privateDoubleprice;

//漲幅
privateDoublerise;
}

抽象得到的策略接口

publicinterfaceStrategy{

/**
*將股票列表排序
*
*@paramsource源數據
*@return排序后的榜單
*/
Listsort(Listsource);
}

實現我們的策略類

/**
*高價榜
*/
publicclassHighPriceRankimplementsStrategy{

@Override
publicListsort(Listsource){
returnsource.stream()
.sorted(Comparator.comparing(Stock::getPrice).reversed())
.collect(Collectors.toList());
}
}

/**
*低價榜
*/
publicclassLowPriceRankimplementsStrategy{

@Override
publicListsort(Listsource){
returnsource.stream()
.sorted(Comparator.comparing(Stock::getPrice))
.collect(Collectors.toList());
}
}

/**
*高漲幅榜
*/
publicclassHighRiseRankimplementsStrategy{

@Override
publicListsort(Listsource){
returnsource.stream()
.sorted(Comparator.comparing(Stock::getRise).reversed())
.collect(Collectors.toList());
}
}

經典的Context類,

publicclassContext{
privateStrategystrategy;

publicvoidsetStrategy(Strategystrategy){
this.strategy=strategy;
}

publicListgetRank(Listsource){
returnstrategy.sort(source);
}
}

于是 我們順禮成章地得到調用類--榜單實例RankServiceImpl

@Service
publicclassRankServiceImpl{

/**
*dataService.getSource()提供原始的股票數據
*/
@Resource
privateDataServicedataService;

/**
*前端傳入榜單類型,返回排序完的榜單
*
*@paramrankType榜單類型
*@return榜單數據
*/
publicListgetRank(StringrankType){
//創建上下文
Contextcontext=newContext();
//這里選擇策略
switch(rankType){
case"HighPrice":
context.setStrategy(newHighPriceRank());
break;
case"LowPrice":
context.setStrategy(newLowPriceRank());
break;
case"HighRise":
context.setStrategy(newHighRiseRank());
break;
default:
thrownewIllegalArgumentException("rankTypenotfound");
}
//然后執行策略
returncontext.getRank(dataService.getSource());
}
}

我們可以看到經典方法,創建了一個接口、三個策略類,還是比較啰嗦的。調用類的實現也待商榷,新增一個策略類還要修改榜單實例(可以用抽象工廠解決,但是復雜度又上升了)。加之我們有更好的選擇,所以此處不再推薦經典策略模式

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

  • 項目地址:https://github.com/YunaiV/yudao-cloud
  • 視頻教程:https://doc.iocoder.cn/video/

三、基于枚舉的策略模式

這里對這種簡單的策略,推薦用枚舉進行優化。枚舉的本質是創建了一些靜態類的集合。

我下面直接給出例子,大家可以直觀感受一下

枚舉策略類

publicenumRankEnum{
//以下三個為策略實例
HighPrice{
@Override
publicListsort(Listsource){
returnsource.stream()
.sorted(Comparator.comparing(Stock::getPrice).reversed())
.collect(Collectors.toList());
}
},
LowPrice{
@Override
publicListsort(Listsource){
returnsource.stream()
.sorted(Comparator.comparing(Stock::getPrice))
.collect(Collectors.toList());
}
},
HighRise{
@Override
publicListsort(Listsource){
returnsource.stream()
.sorted(Comparator.comparing(Stock::getRise).reversed())
.collect(Collectors.toList());
}
};

//這里定義了策略接口
publicabstractListsort(Listsource);
}

對應的調用類也得以優化,榜單實例RankServiceImpl

@Service
publicclassRankServiceImpl{

/**
*dataService.getSource()提供原始的股票數據
*/
@Resource
privateDataServicedataService;

/**
*前端傳入榜單類型,返回排序完的榜單
*
*@paramrankType榜單類型形似RankEnum.HighPrice.name()
*@return榜單數據
*/
publicListgetRank(StringrankType){
//獲取策略,這里如果未匹配會拋IllegalArgumentException異常
RankEnumrank=RankEnum.valueOf(rankType);
//然后執行策略
returnrank.sort(dataService.getSource());
}
}

可以看到,如果策略簡單的話,基于枚舉的策略模式優雅許多,調用方也做到了0修改,但正確地使用枚舉策略模式需要額外考慮以下幾點。

  • 枚舉的策略類是公用且靜態,這意味著這個策略過程不能引入非靜態的部分,擴展性受限
  • 策略模式的目標之一,是優秀的擴展性和可維護性,最好能新增或修改某一策略類時,對其他類是無改動的。而枚舉策略如果過多或者過程復雜,維護是比較困難的,可維護性受限

四、基于工廠的策略模式

為了解決良好的擴展性和可維護性,我更推薦以下利用spring自帶beanFactory的優勢,實現一個基于工廠的策略模式。

策略類改動只是添加了@Service注解,并指定了Service的value屬性

/**
*高價榜
*注意申明Service.value=HighPrice,他是我們的key,下同
*/
@Service("HighPrice")
publicclassHighPriceRankimplementsStrategy{

@Override
publicListsort(Listsource){
returnsource.stream()
.sorted(Comparator.comparing(Stock::getPrice).reversed())
.collect(Collectors.toList());
}
}

/**
*低價榜
*/
@Service("LowPrice")
publicclassLowPriceRankimplementsStrategy{

@Override
publicListsort(Listsource){
returnsource.stream()
.sorted(Comparator.comparing(Stock::getPrice))
.collect(Collectors.toList());
}
}

/**
*高漲幅榜
*/
@Service("HighRise")
publicclassHighRiseRankimplementsStrategy{

@Override
publicListsort(Listsource){
returnsource.stream()
.sorted(Comparator.comparing(Stock::getRise).reversed())
.collect(Collectors.toList());
}
}

調用類修改較大,接入借助spring工廠特性,完成策略類

@Service
publicclassRankServiceImpl{

/**
*dataService.getSource()提供原始的股票數據
*/
@Resource
privateDataServicedataService;
/**
*利用注解@Resource@Autowired特性,直接獲取所有策略類
*key=@Service的value
*/
@Resource
privateMaprankMap;

/**
*前端傳入榜單類型,返回排序完的榜單
*
*@paramrankType榜單類型和Service注解的value屬性一致
*@return榜單數據
*/
publicListgetRank(StringrankType){
//判斷策略是否存在
if(!rankMap.containsKey(rankType)){
thrownewIllegalArgumentException("rankTypenotfound");
}
//獲得策略實例
Strategyrank=rankMap.get(rankType);
//執行策略
returnrank.sort(dataService.getSource());
}
}

若讀者使用的不是Spring,也可以找找對應框架的工廠模式實現,或者自己實現一個抽象工廠。

工廠策略模式會比枚舉策略模式啰嗦,但也更加靈活、易擴展性和易維護。故簡單策略推薦枚舉策略模式,復雜策略才推薦工廠策略模式。



審核編輯 :李倩



聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 框架
    +關注

    關注

    0

    文章

    404

    瀏覽量

    18422
  • 函數
    +關注

    關注

    3

    文章

    4417

    瀏覽量

    67504

原文標題:為什么我不再推薦枚舉策略模式?

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    基于載波優化的云臺馬達驅動板控制策略

    云臺馬達驅動板的控制性能直接決定云臺的定位精度、運行平滑性與續航能力。針對傳統控制策略中載波參數固定、調制模式單一導致的 “低速抖動、高速發熱、噪聲超標” 等問題,本文提出一種基于載波優化的一體化
    的頭像 發表于 03-06 15:16 ?31次閱讀

    直流固態變壓器控制策略仿真解決方案

    實物仿真平臺,可實現DCSST控制策略建模、部署、硬件在環測試的全流程覆蓋,有效提升控制策略的可靠性與適配性,降低開發成本和測試風險,為DCSST的工程化應用及直流微電網的規模化推廣提供技術支撐。 一
    發表于 03-06 09:26

    枚舉類型的講解

    枚舉是一個基本的數據類型,它可以讓數據更簡潔。 如果寫一個判斷星期的文章,我們當然可以使用宏定義來使代碼更加易懂,不過: #define MON 1 #define TUE 2
    發表于 12-08 08:14

    遠程辦公防線不 “失守”,終端防護策略全解析

    隨著企業日益擁抱遠程與混合辦公模式,如何有效保護所有遠程終端已成為核心關切。終端安全策略因此成為關鍵——企業需要建立明確的規范與規則,在保障遠程設備安全的同時,不影響工作效率。在自帶設備(BYOD
    的頭像 發表于 12-02 17:04 ?517次閱讀
    遠程辦公防線不 “失守”,終端防護<b class='flag-5'>策略</b>全解析

    雙轉換VS生態模式:UPS工作原理深度對比與能效優化策略

    支持。今天,我們就來聊聊UPS的兩種主流工作模式——雙轉換模式和生態模式,看看它們各自有什么特點,以及如何優化UPS的能效。一、雙轉換模式:電力純凈的“守護者”1.
    的頭像 發表于 09-26 08:44 ?874次閱讀
    雙轉換VS生態<b class='flag-5'>模式</b>:UPS工作原理深度對比與能效優化<b class='flag-5'>策略</b>

    Redis Sentinel和Cluster模式如何選擇

    十年的運維生涯中,見過太多團隊在Redis集群方案選擇上踩坑。有的團隊盲目追求"高大上"的Cluster模式,結果運維復雜度爆表;有的團隊死守Sentinel不放,最后擴展性成了瓶頸。今天,想通過這篇萬字長文,把
    的頭像 發表于 09-08 09:31 ?580次閱讀

    司受邀參加第八屆電動工具控制與充電技術研討會(蘇州)暨清潔電器技術創新論壇--【其利天下】

    8月22日,第八屆電動工具控制與充電技術研討會(蘇州)暨清潔電器技術創新論壇在蘇州成功舉辦。司應Big-Bit大比特商務網邀請出席本次活動,并由研發總監馮建武先生帶來題為《方弦一體控制策略
    的頭像 發表于 08-22 18:07 ?6438次閱讀
    <b class='flag-5'>我</b>司受邀參加第八屆電動工具控制與充電技術研討會(蘇州)暨清潔電器技術創新論壇--【其利天下】

    CCG3PA是否支持發起BIST 共享容量消息?

    正在使用CCG3PA ,想發起BIST 共享容量消息。檢查了 CCG3PA 的 API 文檔和 PD 堆棧,但找不到任何與啟動BIST 共享容量模式相關的
    發表于 07-23 07:07

    雙三相感應電機SVPWM的新型過調制策略

    摘要:過調制策略能夠提高逆變器輸出電壓范圍和品質,從而提高電機輸出轉速范圍和轉矩特性。針對雙三相感應電機空間矢量脈寬調制(SVPWM)算法過調制區域有限,分區實現復雜,內存占用率大等問題,提出一種
    發表于 06-19 11:10

    普通整流橋失效模式大解析:短路、過熱與浪涌沖擊應對策略

    實際工程角度出發,解析普通整流橋的常見失效模式——短路、過熱與浪涌沖擊,并提供相應的應對策略,幫助工程師實現更可靠的整流電路設計。一、失效模式一:整流橋短路短路是整流橋
    的頭像 發表于 06-13 09:48 ?1466次閱讀
    普通整流橋失效<b class='flag-5'>模式</b>大解析:短路、過熱與浪涌沖擊應對<b class='flag-5'>策略</b>

    輪轂電機HEV能量管理策略優化研究

    純分享帖,需要者可點擊附件免費獲取完整資料~~~*附件:輪轂電機HEV能量管理策略優化研究.pdf【免責聲明】本文系網絡轉載,版權歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權問題,請第一時間告知,刪除內容!
    發表于 06-10 13:16

    如何重新啟動 FX3S 的枚舉過程?

    。 然而,面臨的一個問題是,如果 FX3S 最初沒有連接到 USB 3.0 電纜和 PC,它就不會重新啟動枚舉過程。 在這種情況下,有人能指導如何重新啟動 FX3S 的枚舉過程嗎?
    發表于 05-19 07:34

    2.0 USB集線器CYUSB2304-68LTXI在重新枚舉全速設備時出現錯誤怎么解決?

    剛剛構建的設計中有幾個 USB 2.0 集線器 (CYUSB2304-68LTXI)。 每個集線器都連接有多個全速藍牙設備。 當我重新枚舉其中一個全速設備時,每次重新枚舉都會得到超過 600 個
    發表于 05-19 07:32

    電機大范圍調速的綜合電壓調制策略

    針對電動汽車要求驅動電機具有大范圍調速要求和目前任何單種基本調制方式都無法做到全調制比范圍內性能最優的問題,提出了一種綜合的調制策略:在低調制比階段使用傳統的SVPWM策略,在高調制比階段
    發表于 04-01 14:51

    永磁同步電機矢量控制策略分析

    本文通過矢量控制策略采用 id=0 控制方案快速準確地控制轉矩,實現調速系統具有較高的動態性能。并利用了 Matlab 工具對永磁同步電機矢量控制系統在空載起動、轉速突變、負載突變進行了仿真研究。 點擊附件可直接打開查看全文*附件:永磁同步電機矢量控制策略分析.docx
    發表于 03-20 12:57