99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

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

3天內(nèi)不再提示

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

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

掃碼添加小助手

加入工程師交流群


一、為什么講策略模式

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

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

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

基于 Spring Boot + MyBatis Plus + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

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

二、經(jīng)典策略模式

數(shù)據(jù)DTO

@Data
publicclassStock{

//股票交易代碼
privateStringcode;

//現(xiàn)價
privateDoubleprice;

//漲幅
privateDoublerise;
}

抽象得到的策略接口

publicinterfaceStrategy{

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

實現(xiàn)我們的策略類

/**
*高價榜
*/
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());
}
}

經(jīng)典的Context類,

publicclassContext{
privateStrategystrategy;

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

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

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

@Service
publicclassRankServiceImpl{

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

/**
*前端傳入榜單類型,返回排序完的榜單
*
*@paramrankType榜單類型
*@return榜單數(shù)據(jù)
*/
publicListgetRank(StringrankType){
//創(chuàng)建上下文
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");
}
//然后執(zhí)行策略
returncontext.getRank(dataService.getSource());
}
}

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

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

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

三、基于枚舉的策略模式

這里對這種簡單的策略,推薦用枚舉進行優(yōu)化。枚舉的本質(zhì)是創(chuàng)建了一些靜態(tài)類的集合。

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

枚舉策略類

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);
}

對應(yīng)的調(diào)用類也得以優(yōu)化,榜單實例RankServiceImpl

@Service
publicclassRankServiceImpl{

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

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

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

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

四、基于工廠的策略模式

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

策略類改動只是添加了@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());
}
}

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

@Service
publicclassRankServiceImpl{

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

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

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

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



審核編輯 :李倩



聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 框架
    +關(guān)注

    關(guān)注

    0

    文章

    404

    瀏覽量

    17895
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4381

    瀏覽量

    64887

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    雙三相感應(yīng)電機SVPWM的新型過調(diào)制策略

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

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

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

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

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

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

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

    電機大范圍調(diào)速的綜合電壓調(diào)制策略

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

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

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

    淵亭KGAG升級引入“高級策略推理”

    為了突破現(xiàn)有AI技術(shù)在決策推理方面的局限,淵亭科技對其知識圖譜分析平臺KGAG進行了最新升級,創(chuàng)新性地引入了“高級策略推理”模式。這一模式的引入,實現(xiàn)了“大模型×知識圖譜×專家策略×動
    的頭像 發(fā)表于 02-14 15:07 ?535次閱讀

    設(shè)計模式-策略模式

    作者:京東工業(yè) 孫磊 一、概念 策略模式(Strategy Pattern)也稱為(Policy Parttern)。 它定義了算法家族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變換
    的頭像 發(fā)表于 01-08 13:47 ?363次閱讀
    設(shè)計<b class='flag-5'>模式</b>-<b class='flag-5'>策略</b><b class='flag-5'>模式</b>

    Java 枚舉策略模式、函數(shù)式接口的結(jié)合:實現(xiàn)高內(nèi)聚低耦合的設(shè)計

    中,通常會使用枚舉來定義業(yè)務(wù)上的一組常量,那除了簡單地定義常量之外,我們?nèi)绾卫?b class='flag-5'>枚舉來實現(xiàn)高內(nèi)聚、低耦合的設(shè)計呢?下面介紹下枚舉策略模式、
    的頭像 發(fā)表于 11-21 14:06 ?644次閱讀

    請問什么情況下會損壞TLV2548,或者導(dǎo)致INT信號不再反應(yīng)?

    如題,請問什么情況下會損壞TLV2548,或者導(dǎo)致INT信號不再反應(yīng)? 曾多次驅(qū)動過該AD,都可以正常讀取碼值。但有兩次遇到過AD沒有任何反應(yīng),只在上電的瞬間讀取電壓,INT不再拉低(
    發(fā)表于 11-14 06:39

    蘋果調(diào)整策略:逐步摒棄年更產(chǎn)品發(fā)布模式

    10月8日訊,彭博社知名記者馬克·古爾曼在《Power On》通訊中揭示,蘋果公司正逐步轉(zhuǎn)變其傳統(tǒng)的“年度更新”發(fā)布模式,邁向更為靈活的產(chǎn)品發(fā)布策略。
    的頭像 發(fā)表于 10-08 16:46 ?1167次閱讀

    vca820超過1.5V就不再放大,為什么?

    最近調(diào)了一下vca820.。。。在的電路中,它的電壓控制端口Vg只能從1V到1.5v之間可以實現(xiàn)放大,超過1.5V就不再放大。。。誰可以告訴這是為什么???
    發(fā)表于 09-19 06:08

    使用TM4C129x 微控制器為 TMP1826實現(xiàn)單線枚舉功能應(yīng)用說明

    電子發(fā)燒友網(wǎng)站提供《使用TM4C129x 微控制器為 TMP1826實現(xiàn)單線枚舉功能應(yīng)用說明.pdf》資料免費下載
    發(fā)表于 09-12 11:10 ?0次下載
    使用TM4C129x 微控制器為 TMP1826實現(xiàn)單線<b class='flag-5'>枚舉</b>功能應(yīng)用說明

    設(shè)備管理——先進的工業(yè)設(shè)備管理模式策略

    在設(shè)備老化、故障率高、零部件供應(yīng)不及時等問題中,先進的設(shè)備管理模式策略被廣泛應(yīng)用?;て髽I(yè)在設(shè)備管理方面采取優(yōu)化措施,提高了維修效率和質(zhì)量。
    的頭像 發(fā)表于 08-28 09:36 ?832次閱讀
    設(shè)備管理——先進的工業(yè)設(shè)備管理<b class='flag-5'>模式</b>與<b class='flag-5'>策略</b>

    在Ubuntu 20.04上使用USB 3時遇到了FX3無法枚舉的情況,怎么解決?

    *)CyFxUSB30DeviceDscr`) 中使用。在 Ubuntu 20.04 中是否存在任何已知問題,或者枚舉無法完成的原因? 我們在使用 Ubuntu 18.04 時沒有遇到這個問題。 USB2 可以正常工作。 還附上了 FX3 插入 Ubuntu 20.0
    發(fā)表于 07-26 08:26