国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

一文搞懂設計模式—策略模式

開發 前端
策略模式是一種強大而靈活的設計模式,它可以幫助我們處理不同的算法或行為,并使系統更具可維護性和擴展性。通過封裝具體的策略類和使用上下文對象,我們可以輕松地選擇和切換不同的策略,而無需修改現有的代碼。

在軟件開發中,經常會遇到需要根據不同的條件來實現不同行為的場景。這種場景下,策略模式(Strategy Pattern)就是一種非常有用的設計模式。

策略模式屬于行為型模式,允許我們定義一系列算法,并將其封裝在獨立的策略類中,使得它們可以互相替換。通過使用策略模式,我們能夠靈活地選擇和切換不同的算法,而無需修改原有的代碼,替代?量 if else 的邏輯。

使用場景

策略模式通常在以下情況下被使用:

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

例如:

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

這些只是策略模式的一些例子,實際應用場景非常豐富。通過使用策略模式,我們可以將算法或行為與具體的業務邏輯解耦,使得系統更加靈活和可擴展。

策略模式實現

在策略模式中,有三個核心角色:上下文(Context)、策略接口(Strategy)和具體策略類(Concrete Strategy)。

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

下面我們來實現一下策略模式:

步驟 1

創建策略接口。

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

步驟2

創建策略接口實現類。

//具體策略類
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);
        // 具體的支付邏輯
    }
}

注意:在實際項目中,我們一般通過工廠方法模式來實現策略類的聲明。

實現關系如下:

圖片圖片

步驟 3

創建 Context 類。

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

調用一下:

// 使用示例
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);
    }
}

輸出:

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

在上面的代碼中,我們定義了一個 PaymentStrategy 接口作為策略接口,兩個具體的策略類 CreditCardPayment 和 WeChatPay 實現了該接口。然后,我們創建了一個 PaymentContext 上下文對象,并根據需要傳入不同的策略實例進行支付操作。

策略模式的優缺點

策略模式的優點包括:

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

策略模式的缺點包括:

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

注意事項: 如果一個系統的策略多于四個,就需要考慮使用混合模式,解決策略類膨脹的問題,否則日后的系統維護就會成為一個燙手山芋。

策略模式優化

使用Map取消 Context 類

我們可以將策略實現類放進 Map 中,根據 key 去選擇具體的策略,就不必事先定義 Context 類。

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

策略枚舉解決策略類膨脹

策略枚舉可以解決策略類過多的問題。

我們對原裝的策略模式進行改造,把原有定義在抽象策略中的方法移植到枚舉中,讓枚舉成員成為一個具體策略。

@Slf4j
public 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() 方法,用于具體的支付邏輯。

// 使用示例
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);
    }

注意:策略枚舉是一個非常優秀和方便的模式,但是它受枚舉類型的限制,每個枚舉項都是 public、final、static 的,擴展性受到了一定的約束,因此在系統開發中,策略枚舉一般擔當不經常發生變化的角色。

SpringBoot中的策略模式

SpringBoot中使用策略模式更加方便:

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

使用的時候 @Autowired 或者 @Resource 即可,SpringBoot會幫我們把實現類自動注入注入Map。

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

總結

策略模式是一種強大而靈活的設計模式,它可以幫助我們處理不同的算法或行為,并使系統更具可維護性和擴展性。通過封裝具體的策略類和使用上下文對象,我們可以輕松地選擇和切換不同的策略,而無需修改現有的代碼。

責任編輯:武曉燕 來源: Java隨想錄
相關推薦

2023-05-22 13:27:17

2024-02-26 11:52:38

代理模式設計

2024-02-19 13:11:38

門面模式系統

2024-02-21 12:24:33

模板設計模式框架

2024-01-30 13:15:00

設計模式責任鏈

2024-02-23 12:11:53

裝飾器模式對象

2024-02-27 11:59:12

享元模式對象

2024-02-04 12:04:17

2024-02-22 12:13:49

適配器模式代碼

2024-02-18 12:36:09

2024-02-20 12:09:32

模式工廠方法接口

2022-05-05 16:47:24

Docker網絡空間容器

2025-06-30 00:32:43

策略模式算法MyBatis

2022-09-21 16:56:16

設計模式微服務架構

2022-03-24 08:51:48

Redis互聯網NoSQL

2024-04-12 12:19:08

語言模型AI

2020-11-17 09:32:57

設計模式責任鏈

2013-11-26 16:09:34

Android設計模式

2020-11-10 09:20:40

開發模式代碼

2024-06-26 10:29:02

商品中心設計生成器
點贊
收藏

51CTO技術棧公眾號

亚洲电影成人| 亚洲精品自拍动漫在线| 4388成人网| 懂色av中文在线| 国产精品中文欧美| 成人国产精品一区二区| 精品欧美一区二区三区在线观看| 午夜精品国产更新| 日日橹狠狠爱欧美超碰| 激情欧美国产欧美| 国产精品99久久久久久久久久久久| 日本不卡网站| 色婷婷av久久久久久久| 婷婷免费在线观看| 国产福利91精品一区二区三区| 国产精品一区二区在线观看| 免费av一区| 日韩网站免费观看高清| 伊人春色在线观看| 色老汉一区二区三区| 九九热精品在线播放| 国产真实精品久久二三区| 国产精品国产三级国产专区53| 你懂的在线观看一区二区| 日韩中文第一页| 欧美日韩免费看片| 日韩电影大片中文字幕| 免费黄色在线| 欧美日韩美少妇| 日本护士...精品国| 亚洲一二三四区| 国产国产国产国产国产国产| 久久―日本道色综合久久| 日韩一级片一区二区| 日本不卡一二三区黄网| 欧美久久久久久一卡四| 亚洲啪啪91| 国产精品免费一区二区三区四区| 精品视频黄色| 国产精品91久久久久久| 国产 日韩 欧美 综合 一区| 伊人伊人伊人久久| 欧美xxx视频| 国产一区二区久久精品| 欧美男体视频| 中文字幕日韩精品在线| 日本国产欧美| 中文字幕亚洲自拍| 91丨精品丨国产| 欧美大片va欧美在线播放| av在线精品| 97国产成人精品视频| 综合伊思人在钱三区| 国产精品美女呻吟| 中文字幕一区二区三区欧美日韩| 成人黄色在线观看| 狠狠综合久久av一区二区老牛| 国产亚洲自拍偷拍| 天堂一区二区在线| 国产日产欧美一区二区| av一区二区三区| 国产精品一区二区小说| 亚洲精品成人a在线观看| 尤物视频在线观看| 欧美四级电影在线观看| 丁香花在线高清完整版视频| 亚洲美女av黄| 不卡一区视频| 国产精品成人观看视频国产奇米| 亚洲成人tv| 天堂√在线观看一区二区| 久久99精品久久只有精品| 欧美国产视频一区| 国产精品女主播av| 欧美香蕉爽爽人人爽| 精品女同一区二区| 久久伊人精品| 国产日韩av在线| 日韩影院免费视频| 欧美黄网站在线观看| 亚洲不卡在线观看| 成全电影大全在线观看| 欧美日韩国产成人| 欧美久久视频| 国产精品第157页| 亚洲国产日韩综合久久精品| 色黄网站在线观看| 久久久久中文字幕| 亚洲精品激情| 大陆极品少妇内射aaaaa| 亚洲高清不卡在线| 欧美激情护士| 国产成人精品在线观看| 日韩电影网1区2区| 四虎最新网站| 精品国产一区二区三区忘忧草 | 美女被久久久| 男女激情无遮挡| 欧美性高潮在线| 456成人影院在线观看| 国产美女精彩久久| 成人性生交大片免费看中文| 中文在线а√天堂官网| 亚洲欧美日韩中文在线| 久久一级电影| 欧美日韩在线中文| 欧美日韩亚洲综合| 91久久精品无嫩草影院| 精品国产乱码久久久久久88av| 久久精品日韩一区二区三区| 国产精品久久麻豆| 日本国产高清不卡| 国产一区二区在线看| 手机看片福利在线观看| 久久视频精品在线| 久久高清一区| 天堂男人av| 在线观看国产欧美| 亚洲区一区二| 亚洲美女在线免费观看| 日韩最新免费不卡| 美女尤物久久精品| 中文天堂av| 欧美丰满片xxx777| 国内成人精品2018免费看| 青春草在线观看 | 欧美jizz18性欧美| 91精品视频网| 国产精品视频26uuu| 91干在线观看| 日韩网站在线观看| 欧美一区二区三区视频免费| 一区在线中文字幕| 久久激情综合| 国产精品成人一区二区不卡| 亚洲成a人片| 嫩草在线播放| 在线碰免费视频在线观看| 黄色国产网站在线播放| 欧美日韩精品免费观看视完整| 校园春色欧美| 青草青草久热精品视频在线观看| 精品一区二区三区视频在线观看| 一级毛片久久久| 亚洲精品久久久中文字幕| 清纯唯美一区二区三区| 日韩av电影国产| 午夜成人免费视频| 国产成人aaa| 第一sis亚洲原创| 国产在线视频福利| 成年人羞羞的网站| 亚洲精品中文字幕乱码三区不卡 | 中文字幕亚洲欧美| 午夜国产不卡在线观看视频| 久久成人18免费观看| 偷偷www综合久久久久久久| 国产日本亚洲| 成人在线不卡| 厕沟全景美女厕沟精品| 91这里只有精品| 亚洲最新合集| 国产美女在线一区| 你懂的视频在线一区二区| 国产精品草莓在线免费观看| 久久影视电视剧免费网站| 欧美久久久久久久久| 中文字幕视频一区| 国产日韩欧美亚洲| 91亚洲国产成人精品一区二三| 精品国产中文字幕第一页| 欧美禁忌电影网| 第一sis亚洲原创| 高清不卡在线观看av| 免费高清在线一区| 激情亚洲综合在线| 成人av免费观看| 国产三级伦理在线| 精品国产亚洲在线| 欧美激情国产日韩| 欧美色婷婷久久99精品红桃| 强制捆绑调教一区二区| 国产精品视频一区国模私拍 | 亚洲欧洲黄色网| 欧美高清视频不卡网| 亚洲成人免费在线视频| 久久久视频精品| 国产99午夜精品一区二区三区 | 91精品中国老女人| 99久久免费国| 成人av免费在线观看| 日韩国产在线不卡视频| 国产精品入口免费软件| 国产精品久久中文| 精品捆绑美女sm三区| 91精品视频观看| 800av在线免费观看| 97人洗澡人人免费公开视频碰碰碰| 亚洲妇熟xx妇色黄| 久久国产精品毛片|