日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

一文搞懂設(shè)計模式—策略模式

來源: 責(zé)編: 時間:2024-02-01 12:52:11 290觀看
導(dǎo)讀在軟件開發(fā)中,經(jīng)常會遇到需要根據(jù)不同的條件來實現(xiàn)不同行為的場景。這種場景下,策略模式(Strategy Pattern)就是一種非常有用的設(shè)計模式。策略模式屬于行為型模式,允許我們定義一系列算法,并將其封裝在獨立的策略類中,使得它

在軟件開發(fā)中,經(jīng)常會遇到需要根據(jù)不同的條件來實現(xiàn)不同行為的場景。這種場景下,策略模式(Strategy Pattern)就是一種非常有用的設(shè)計模式。3Zy28資訊網(wǎng)——每日最新資訊28at.com

策略模式屬于行為型模式,允許我們定義一系列算法,并將其封裝在獨立的策略類中,使得它們可以互相替換。通過使用策略模式,我們能夠靈活地選擇和切換不同的算法,而無需修改原有的代碼,替代?量 if else 的邏輯。3Zy28資訊網(wǎng)——每日最新資訊28at.com

使用場景

策略模式通常在以下情況下被使用:3Zy28資訊網(wǎng)——每日最新資訊28at.com

  • 當(dāng)存在多種實現(xiàn)方式,且需要在運行時動態(tài)選擇具體實現(xiàn)時,策略模式非常有用。例如,一個購物應(yīng)用可能需要根據(jù)用戶的會員等級來計算折扣,不同等級對應(yīng)不同的計算方式,這時就可以使用策略模式來實現(xiàn)。
  • 當(dāng)存在一組類似的行為,只是實現(xiàn)細(xì)節(jié)略有不同,但又不希望通過繼承來添加新的子類時,策略模式也很適用。它將這組行為封裝在獨立的策略類中,并通過委托的方式在上下文對象中使用。

例如:3Zy28資訊網(wǎng)——每日最新資訊28at.com

  • 支付方式選擇:一個電子商務(wù)平臺可以根據(jù)用戶的選擇來使用不同的支付策略,例如信用卡支付、支付寶支付、微信支付等。
  • 排序算法選擇:一個排序工具可以根據(jù)用戶的需求選擇不同的排序算法,例如快速排序、歸并排序等。
  • 數(shù)據(jù)驗證:一個表單驗證工具可以根據(jù)不同的驗證規(guī)則采用不同的驗證策略,例如長度驗證、格式驗證等。

這些只是策略模式的一些例子,實際應(yīng)用場景非常豐富。通過使用策略模式,我們可以將算法或行為與具體的業(yè)務(wù)邏輯解耦,使得系統(tǒng)更加靈活和可擴展。3Zy28資訊網(wǎng)——每日最新資訊28at.com

策略模式實現(xiàn)

在策略模式中,有三個核心角色:上下文(Context)、策略接口(Strategy)和具體策略類(Concrete Strategy)。3Zy28資訊網(wǎng)——每日最新資訊28at.com

  • 上下文(Context):封裝了具體策略的執(zhí)行邏輯,提供給客戶端使用的接口。上下文通常包含一個指向策略接口的引用,用于調(diào)用具體策略的方法。
  • 策略接口(Strategy):定義了一組算法或行為的公共接口,所有具體策略都必須實現(xiàn)該接口。
  • 具體策略類(Concrete Strategy):實現(xiàn)了策略接口,提供了具體的算法或行為。

下面我們來實現(xiàn)一下策略模式:3Zy28資訊網(wǎng)——每日最新資訊28at.com

步驟 1

創(chuàng)建策略接口。3Zy28資訊網(wǎng)——每日最新資訊28at.com

//策略接口public interface PaymentStrategy {    void pay(double amount);}

步驟2

創(chuàng)建策略接口實現(xiàn)類。3Zy28資訊網(wǎng)——每日最新資訊28at.com

//具體策略類public class CreditCardPayment implements PaymentStrategy {    public void pay(double amount) {        System.out.println("使用信用卡支付:" + amount);        // 具體的支付邏輯    }}
public class WeChatPay implements PaymentStrategy {    public void pay(double amount) {        System.out.println("使用微信支付:" + amount);        // 具體的支付邏輯    }}

注意:在實際項目中,我們一般通過工廠方法模式來實現(xiàn)策略類的聲明。3Zy28資訊網(wǎng)——每日最新資訊28at.com

實現(xiàn)關(guān)系如下:3Zy28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片3Zy28資訊網(wǎng)——每日最新資訊28at.com

步驟 3

創(chuàng)建 Context 類。3Zy28資訊網(wǎng)——每日最新資訊28at.com

// 上下文類public class PaymentContext {    private PaymentStrategy paymentStrategy;        public PaymentContext(PaymentStrategy paymentStrategy) {        this.paymentStrategy = paymentStrategy;    }        public void pay(double amount) {        paymentStrategy.pay(amount);    }}

調(diào)用一下:3Zy28資訊網(wǎng)——每日最新資訊28at.com

// 使用示例public class Main {    public static void main(String[] args) {        PaymentStrategy strategy = new CreditCardPayment();        PaymentContext context = new PaymentContext(strategy);        context.pay(100.0);                strategy = new WeChatPay();        context = new PaymentContext(strategy);        context.pay(200.0);    }}

輸出:3Zy28資訊網(wǎng)——每日最新資訊28at.com

使用信用卡支付:100.0使用微信支付:200.0

在上面的代碼中,我們定義了一個 PaymentStrategy 接口作為策略接口,兩個具體的策略類 CreditCardPayment 和 WeChatPay 實現(xiàn)了該接口。然后,我們創(chuàng)建了一個 PaymentContext 上下文對象,并根據(jù)需要傳入不同的策略實例進(jìn)行支付操作。3Zy28資訊網(wǎng)——每日最新資訊28at.com

策略模式的優(yōu)缺點

策略模式的優(yōu)點包括:3Zy28資訊網(wǎng)——每日最新資訊28at.com

  • 松耦合:策略模式將不同的策略封裝在獨立的類中,與上下文對象解耦,增加了代碼的靈活性和可維護性。
  • 易于擴展:可以通過添加新的策略類來擴展系統(tǒng)的功能,無需修改現(xiàn)有代碼。
  • 符合開閉原則:對于新的策略,無需修改上下文對象,只需要實現(xiàn)新的策略接口即可。

策略模式的缺點包括:3Zy28資訊網(wǎng)——每日最新資訊28at.com

  • 類數(shù)量增多:每個具體策略都需要一個獨立的類,如果策略較多,將導(dǎo)致類的數(shù)量增加。
  • 上層必須知道所有策略類:上層模塊必須知道有哪些策略,并選擇合適的策略進(jìn)行使用,這與迪米特法則是相違背的,我只是想使用了一個策略,我憑什么就要了解這個策略呢?那要你的封裝類還有什么 意義?這是原裝策略模式的一個缺點。

注意事項: 如果一個系統(tǒng)的策略多于四個,就需要考慮使用混合模式,解決策略類膨脹的問題,否則日后的系統(tǒng)維護就會成為一個燙手山芋。3Zy28資訊網(wǎng)——每日最新資訊28at.com

策略模式優(yōu)化

使用Map取消 Context 類

我們可以將策略實現(xiàn)類放進(jìn) Map 中,根據(jù) key 去選擇具體的策略,就不必事先定義 Context 類。3Zy28資訊網(wǎng)——每日最新資訊28at.com

public static void main(String[] args) {        Map<String, PaymentStrategy> map=new HashMap<>();        map.put("CREDIT_CARD", new CreditCardPayment());        map.put("WECHAT_PAY",new WeChatPay());        map.get("CREDIT_CARD").pay(100.0);        map.get("WECHAT_PAY").pay(200.0);    }

策略枚舉解決策略類膨脹

策略枚舉可以解決策略類過多的問題。3Zy28資訊網(wǎng)——每日最新資訊28at.com

我們對原裝的策略模式進(jìn)行改造,把原有定義在抽象策略中的方法移植到枚舉中,讓枚舉成員成為一個具體策略。3Zy28資訊網(wǎng)——每日最新資訊28at.com

@Slf4jpublic enum PaymentStrategyEnum {    CREDIT_CARD {        @Override        public void pay(double amount) {            log.info("使用信用卡支付:" + amount);            // 具體的支付邏輯        }    },    WECHAT_PAY {        @Override        public void pay(double amount) {            log.info("使用微信支付:" + amount);            // 具體的支付邏輯        }            };    public abstract void pay(double amount);}

在上面的代碼中,我們定義了一個枚舉類型 PaymentStrategy,其中包含兩個枚舉常量 CREDIT_CARD 和 WECHAT_PAY。每個枚舉常量都重寫了 pay() 方法,用于具體的支付邏輯。3Zy28資訊網(wǎng)——每日最新資訊28at.com

// 使用示例public static void main(String[] args) {        Map<String, PaymentStrategyEnum> map=new HashMap<>();        map.put("CREDIT_CARD",  PaymentStrategyEnum.CREDIT_CARD);        map.put("WECHAT_PAY", PaymentStrategyEnum.WECHAT_PAY);        map.get("CREDIT_CARD").pay(100.0);        map.get("WECHAT_PAY").pay(200.0);    }

注意:策略枚舉是一個非常優(yōu)秀和方便的模式,但是它受枚舉類型的限制,每個枚舉項都是 public、final、static 的,擴展性受到了一定的約束,因此在系統(tǒng)開發(fā)中,策略枚舉一般擔(dān)當(dāng)不經(jīng)常發(fā)生變化的角色。3Zy28資訊網(wǎng)——每日最新資訊28at.com

SpringBoot中的策略模式

SpringBoot中使用策略模式更加方便:3Zy28資訊網(wǎng)——每日最新資訊28at.com

public interface Test {    void print(String name);}
@Service("testA")@Slf4jpublic class TestA implements Test{    @Override    public void print(String name) {        log.info("實現(xiàn)類A"+name);    }}
@Service("testB")@Slf4jpublic class TestB implements Test{    @Override    public void print(String name) {        log.info("實現(xiàn)類B"+name);    }}

使用的時候 @Autowired 或者 @Resource 即可,SpringBoot會幫我們把實現(xiàn)類自動注入注入Map。3Zy28資訊網(wǎng)——每日最新資訊28at.com

@Resourceprivate Map<String,Test> map;
Test test = map.get("你想拿出的具體策略類");test.print("hello world");

總結(jié)

策略模式是一種強大而靈活的設(shè)計模式,它可以幫助我們處理不同的算法或行為,并使系統(tǒng)更具可維護性和擴展性。通過封裝具體的策略類和使用上下文對象,我們可以輕松地選擇和切換不同的策略,而無需修改現(xiàn)有的代碼。3Zy28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-70477-0.html一文搞懂設(shè)計模式—策略模式

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 深入理解Java線程池,剖析LinkedBlockingQueue源碼實現(xiàn)

下一篇: Java中的并發(fā)編程模型及其應(yīng)對策略

標(biāo)簽:
  • 熱門焦點
  • 石頭自清潔掃拖機器人G10S評測:多年黑科技集大成之作 懶人終極福音

    科技圈經(jīng)常能看到一個詞叫“縫合怪”,用來形容那些把好多功能或者外觀結(jié)合在一起的產(chǎn)品,通常這樣的詞是貶義詞,但如果真的是產(chǎn)品縫合的好、縫合的實用的話,那它就成了中性詞,今
  • 線程通訊的三種方法!通俗易懂

    線程通信是指多個線程之間通過某種機制進(jìn)行協(xié)調(diào)和交互,例如,線程等待和通知機制就是線程通訊的主要手段之一。 在 Java 中,線程等待和通知的實現(xiàn)手段有以下幾種方式:Object 類下
  • Automa-通過連接塊來自動化你的瀏覽器

    1、前言通過瀏覽器插件可實現(xiàn)自動化腳本的錄制與編寫,具有代表性的工具就是:Selenium IDE、Katalon Recorder,對于簡單的業(yè)務(wù)來說可快速實現(xiàn)自動化的上手工作。Selenium IDEKat
  • 十個簡單但很有用的Python裝飾器

    裝飾器(Decorators)是Python中一種強大而靈活的功能,用于修改或增強函數(shù)或類的行為。裝飾器本質(zhì)上是一個函數(shù),它接受另一個函數(shù)或類作為參數(shù),并返回一個新的函數(shù)或類。它們通常用
  • .NET 程序的 GDI 句柄泄露的再反思

    一、背景1. 講故事上個月我寫過一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,當(dāng)時用的是 GDIView + WinDbg 把問題搞定,前者用來定位泄露資源,后者用來定位泄露代碼,后面有朋友反
  • 為什么你不應(yīng)該使用Div作為可點擊元素

    按鈕是為任何網(wǎng)絡(luò)應(yīng)用程序提供交互性的最常見方式。但我們經(jīng)常傾向于使用其他HTML元素,如 div span 等作為 clickable 元素。但通過這樣做,我們錯過了許多內(nèi)置瀏覽器的功能。
  • 網(wǎng)紅炒股不為了賺錢,那就是耍流氓!

    來源:首席商業(yè)評論6月26日高調(diào)宣布入市,網(wǎng)絡(luò)名嘴大v胡錫進(jìn)居然進(jìn)軍了股市。在一次財經(jīng)媒體峰會上,幾個財經(jīng)圈媒體大佬就&ldquo;胡錫進(jìn)炒股是否知道認(rèn)真報道&rdquo;展開討論。有
  • iQOO Neo8系列今日官宣:首發(fā)天璣9200+ 全球安卓最強芯!

    在昨日舉行的的聯(lián)發(fā)科新一代旗艦芯片天璣9200+的發(fā)布會上,iQOO官方也正式宣布,全新的iQOO Neo8系列新品將全球首發(fā)搭載這款當(dāng)前性能最強大的移動平臺
  • 2022爆款:ROG魔霸6 冰川散熱系統(tǒng)持續(xù)護航

    喜逢開學(xué)季,各大商家開始推出自己的新產(chǎn)品,進(jìn)行打折促銷活動。對于忠實的端游愛好者來說,能夠擁有一款夢寐以求的筆記本電腦是一件十分開心的事。但是現(xiàn)在的
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
性欧美超级视频| 亚洲国产一区二区三区高清| 欧美午夜一区二区三区免费大片| 欧美日韩中文字幕日韩欧美| 国产精品免费福利| 国产亚洲在线观看| 在线观看国产日韩| 一区二区三区黄色| 亚洲欧美偷拍卡通变态| 久久伊伊香蕉| 欧美日韩亚洲国产精品| 国产伦精品免费视频| 亚洲电影免费观看高清完整版在线| 亚洲乱码精品一二三四区日韩在线 | 夜夜爽www精品| 欧美一级片一区| 欧美国产日产韩国视频| 国产精品麻豆成人av电影艾秋| 精品成人国产在线观看男人呻吟| 亚洲麻豆视频| 久久成人18免费观看| 欧美精品久久99久久在免费线| 国产精品视频免费在线观看| 亚洲国产福利在线| 午夜日韩电影| 欧美精品亚洲二区| 国产在线播精品第三| 日韩一级黄色大片| 久久久噜噜噜久噜久久| 欧美三级欧美一级| 亚洲福利视频在线| 香港久久久电影| 欧美日韩精品| 亚洲丰满少妇videoshd| 欧美一区二区日韩| 欧美视频一区二区三区…| 在线观看日韩www视频免费| 亚洲视频在线观看| 欧美h视频在线| 国产一区激情| 亚洲在线播放| 欧美日韩亚洲一区三区| 亚洲国产高清视频| 久久国产日韩欧美| 国产精品久久91| 亚洲人精品午夜| 久久裸体艺术| 国产亚洲欧美aaaa| 亚洲伊人久久综合| 欧美久久久久久| 精品av久久707| 久久国产精品久久w女人spa| 国产精品视频| 亚洲小少妇裸体bbw| 欧美另类变人与禽xxxxx| 国自产拍偷拍福利精品免费一| 亚洲在线观看免费视频| 欧美日韩国产一区二区三区| 亚洲激情一区二区| 久热精品在线视频| 激情五月综合色婷婷一区二区| 欧美影院精品一区| 国产精品一区二区三区成人| 一区二区三区精品久久久| 欧美精品乱人伦久久久久久| 亚洲电影免费在线观看| 久久中文精品| 一区视频在线播放| 久久久久久999| 国产一区二区三区日韩欧美| 欧美一区二区三区免费观看| 国产精品丝袜白浆摸在线| 亚洲综合色婷婷| 国产精品嫩草久久久久| 亚洲综合电影| 国产精品亚洲欧美| 亚洲欧美一区二区原创| 国产精品一二三四区| 亚洲午夜视频在线| 国产精品劲爆视频| 亚洲中字黄色| 国产精品视频免费一区| 香蕉免费一区二区三区在线观看 | 国产伦精品一区二区三区照片91 | 欧美日韩在线免费视频| 夜色激情一区二区| 欧美三级视频| 亚洲在线第一页| 国产精品日韩一区二区三区| 午夜精品亚洲| 国产私拍一区| 久久综合色婷婷| 亚洲黄色成人网| 欧美日韩国产经典色站一区二区三区| 亚洲理论在线| 国产精品国产三级欧美二区| 亚洲欧美视频在线| 国产视频久久| 久久综合国产精品| 亚洲精品日韩久久| 国产精品家教| 久久久精品国产99久久精品芒果| 在线不卡亚洲| 欧美激情自拍| 亚洲桃花岛网站| 国产精品自拍视频| 久久久久看片| 亚洲精品影院在线观看| 欧美性大战xxxxx久久久| 亚洲欧美一区二区原创| 韩国三级在线一区| 欧美承认网站| 亚洲一区二区三区精品视频| 国产三级欧美三级| 免费久久99精品国产自在现线| 99综合在线| 国产亚洲在线| 欧美精品日本| 午夜国产精品影院在线观看| 一区一区视频| 欧美日韩一区二区三区在线看| 午夜久久一区| 亚洲国产精品传媒在线观看 | 欧美日韩在线观看一区二区| 欧美主播一区二区三区美女 久久精品人 | 欧美在线视频二区| 亚洲国产精品热久久| 欧美三级电影一区| 久久黄金**| 亚洲免费精彩视频| 国产日产高清欧美一区二区三区| 久久综合激情| 亚洲一区二区不卡免费| 在线免费观看视频一区| 欧美午夜三级| 久久亚洲欧美国产精品乐播| 一区二区三区高清在线观看| 国内成人自拍视频| 欧美日韩一区二区免费在线观看| 久久精品91| 中文欧美字幕免费| 国产原创一区二区| 欧美日韩一本到| 久久久久久亚洲精品杨幂换脸| 一区二区日韩伦理片| 影视先锋久久| 国产精品亚洲成人| 欧美激情亚洲综合一区| 欧美一区深夜视频| 夜夜爽夜夜爽精品视频| 精品av久久707| 国产精品久久久久久久久久妞妞| 毛片精品免费在线观看| 午夜精品福利电影| 日韩一区二区精品葵司在线| 激情久久综艺| 国产精品视频网| 欧美精品七区| 久久尤物视频| 篠田优中文在线播放第一区| 9l国产精品久久久久麻豆| 亚洲高清一二三区| 国产一区二区成人久久免费影院| 欧美揉bbbbb揉bbbbb| 欧美成人影音| 久久久一区二区| 午夜日本精品| 亚洲视频成人| 亚洲乱码精品一二三四区日韩在线| 国内精品久久久久影院优| 国产精品美女999| 欧美日韩国产首页在线观看| 免费成人高清视频| 久久久久成人精品| 欧美一区免费| 亚洲欧美日韩视频一区| 日韩午夜激情av| 亚洲三级色网| 亚洲国产综合91精品麻豆| 一区二区三区在线高清| 国产精品视频免费在线观看| 国产精品成人va在线观看| 欧美日韩亚洲不卡| 欧美日韩伦理在线免费| 欧美国产日韩一区二区在线观看 | 国产麻豆精品theporn| 国产精品成人va在线观看| 欧美日韩国产区| 欧美精品在线播放| 欧美精品在线观看播放| 欧美成人午夜影院| 免费欧美网站| 免费在线欧美视频| 美女国产精品| 你懂的国产精品永久在线| 久久综合一区二区三区| 久久久激情视频| 久久久亚洲一区| 久久综合色播五月| 蜜桃伊人久久| 欧美福利在线| 欧美日本在线一区| 欧美日韩视频在线一区二区| 欧美日一区二区三区在线观看国产免 |