最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中策略設(shè)計模式的實現(xiàn)及應(yīng)用場景

 更新時間:2023年04月25日 08:33:48   作者:.番茄炒蛋  
策略設(shè)計模式是Java中一種常用的設(shè)計模式,它通過定義一系列算法并將其封裝成獨立的策略類,從而使得算法可以在不影響客戶端的情況下隨時切換。策略設(shè)計模式主要應(yīng)用于系統(tǒng)中存在多種相似的算法、需要靈活調(diào)整算法邏輯或者需要擴(kuò)展新的算法等場景

介紹

Java策略模式(Strategy Pattern)是一種行為設(shè)計模式,它允許再運(yùn)行時動態(tài)選擇算法的行為.策略模式通過將算法封裝在可互換的策略對象中,使得客戶端代碼能夠輕松地切換算法,而無需修改原始代碼.在策略模式中,每個算法都被實現(xiàn)為一個單獨的策略類,這些策略類都實現(xiàn)了相同的接口,從而允許它們在運(yùn)行時互相替換.

在Java中,可以使用接口或抽象類來定義策略接口.然后對于每個算法,都可以創(chuàng)建一個具體的實現(xiàn)類來實現(xiàn)這個接口.客戶端代碼可以通過將不同的策略對象傳遞給上下文對象來選擇不同的算法.

Java策略模式通常包括以下三種角色:

  • Context(上下文):是策略模式中的核心類,用來管理具體策略實現(xiàn)類的創(chuàng)建,配置和執(zhí)行,以及在運(yùn)行時動態(tài)地選擇具體的策略實現(xiàn)類.
  • Strategy(策略):是一個接口或抽象類,定義了策略實現(xiàn)類的通用方法和屬性,具體策略實現(xiàn)類必須實現(xiàn)這些方法和屬性.
  • ConcreteStrategy(具體策略):是策略接口的實現(xiàn)類,根據(jù)具體業(yè)務(wù)需求實現(xiàn)了策略接口定義的方法和屬性.可以又多個具體策略實現(xiàn)類,Context類在運(yùn)行時根據(jù)需要動態(tài)地選擇具體的策略實現(xiàn)類.

實現(xiàn)

支付策略接口(Strategy)

public interface PaymentStrategy {
    /**
     * 支付
     *
     * @param amount
     */
    void pay(double amount);
}

微信支付和支付寶支付(ConcreteStrategy)

public class WechatPayment implements PaymentStrategy {
    private String username;
    private String password;
    public WechatPayment(String username, String password) {
        this.username = username;
        this.password = password;
    }
    /**
     * 支付
     *
     * @param amount
     */
    @Override
    public void pay(double amount) {
        System.out.println("微信支付:" + amount + "元");
    }
}
public class AliPayment implements PaymentStrategy{
    private String username;
    private String password;
    public AliPayment(String username, String password) {
        this.username = username;
        this.password = password;
    }
    /**
     * 支付
     *
     * @param amount
     */
    @Override
    public void pay(double amount) {
        System.out.println("支付寶支付:" + amount + "元");
    }
}

購物車類(Context)

public class ShoppingCart {
    private List<Item> itemList;
    private PaymentStrategy paymentStrategy;
    public ShoppingCart() {
        itemList = new ArrayList<>();
    }
    public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }
    public void addItem(Item item){
        itemList.add(item);
    }
    public void removeItem(Item item){
        itemList.remove(item);
    }
    public double calculateTotal(){
        return itemList.stream().mapToDouble(Item::getPrice).sum();
    }
    public void pay(){
        paymentStrategy.pay(calculateTotal());
    }
}

商品類

@Data
public class Item {
    private String name;
    private double price;
    public Item(String name, double price) {
        this.name = name;
        this.price = price;
    }
}

測試

public class Demo {
    public static void main(String[] args) {
        ShoppingCart shoppingCart = new ShoppingCart();
        Item item1 = new Item("item1",10);
        Item item2 = new Item("item2",10);
        shoppingCart.addItem(item1);
        shoppingCart.addItem(item2);
        shoppingCart.setPaymentStrategy(new AliPayment("aliPayUsername","aliPayPassword"));
        shoppingCart.pay();
        shoppingCart.setPaymentStrategy(new WechatPayment("wechatUsername","wechatPassword"));
        shoppingCart.pay();
    }
}

上面代碼演示了一個簡單的策略模式實現(xiàn).我們定義了一個PaymentStrategy接口,它表示所有支付方式的共同操作.我們還定義了兩個實現(xiàn)該接口的具體類AliPayment和WechatPayment,它們分別表示使用支付寶和微信支付的操作.我們還定義了一個ShoppingCart類,該類使用PaymentStrategy接口來表示支付方式,并根據(jù)需要切換實際的支付方式.

在我們的Demo類中,我們創(chuàng)建了一個ShoppingCart對象,并添加了兩個Item對象,我們?nèi)缓筮x擇使用AliPayment進(jìn)行支付,并調(diào)用pay()方法.我們接下來又選擇使用WechatPayment進(jìn)行支付,并再次調(diào)用pay()方法.

這樣,我們就可以輕松地在不同的支付方式之間進(jìn)行切換,并根據(jù)需要添加新的支付方式.

總結(jié)

優(yōu)點

  • 容易擴(kuò)展和維護(hù):通過定義一個抽象的策略接口,可以方便地增加新的策略實現(xiàn)類,而不需要修改現(xiàn)有代碼
  • 易于替換算法:在運(yùn)行時可以動態(tài)地切換算法實現(xiàn),無需修改客戶端代碼
  • 降低了耦合度:客戶端只需要知道策略接口即可,不需要知道具體的策略實現(xiàn)類
  • 提高了復(fù)用性:不同的策略實現(xiàn)類可以在多個場景下復(fù)用

缺點

  • 增加了類的數(shù)量:為每個具體策略都定義了一個實現(xiàn)類,可能會增加類的數(shù)量.
  • 客戶端必須知道策略接口:客戶端需要知道具體的策略接口,才能正確使用策略實現(xiàn)類.
  • 運(yùn)行時開銷較大:在運(yùn)行時,需要根據(jù)不同的策略實現(xiàn)類進(jìn)行判斷和選擇,會帶來一定的開銷

應(yīng)用場景

  • 有多個相似的類,只有行為有差異的情況下,可以考慮使用策略模式.
  • 需要在運(yùn)行時動態(tài)切換算法的情況下,可以使用策略模式.
  • 一個系統(tǒng)需要在不同時間應(yīng)用不同的業(yè)務(wù)規(guī)則情況下,可以使用策略模式
  • 在一個系統(tǒng)中,有許多類需要根據(jù)某種規(guī)則進(jìn)行排序,查找等操作的情況下,可以使用策略模式.

到此這篇關(guān)于Java中策略設(shè)計模式的實現(xiàn)及應(yīng)用場景的文章就介紹到這了,更多相關(guān)Java策略設(shè)計模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java多線程學(xué)習(xí)之死鎖的模擬和避免(實例講解)

    java多線程學(xué)習(xí)之死鎖的模擬和避免(實例講解)

    下面小編就為大家?guī)硪黄猨ava多線程學(xué)習(xí)之死鎖的模擬和避免(實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • 關(guān)于Mybatis-Plus字段策略與數(shù)據(jù)庫自動更新時間的一些問題

    關(guān)于Mybatis-Plus字段策略與數(shù)據(jù)庫自動更新時間的一些問題

    這篇文章主要介紹了關(guān)于Mybatis-Plus字段策略與數(shù)據(jù)庫自動更新時間的一些問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Spring框架對于Bean的管理詳解

    Spring框架對于Bean的管理詳解

    在實際開發(fā)中,我們往往要用到Spring容器為我們提供的諸多資源,例如想要獲取到容器中的配置、獲取到容器中的Bean等等。本文為大家詳細(xì)講講工具類如何獲取到Spring容器中的Bean,需要的可以參考一下
    2022-07-07
  • 盤點SpringBoot中@Async注解的遇到的坑點及解決辦法

    盤點SpringBoot中@Async注解的遇到的坑點及解決辦法

    SpringBoot是一個流行的Java開發(fā)框架,在異步編程方面,Spring Boot提供了@Async注解,它能夠讓方法異步執(zhí)行,然而,在使用@Async注解時,有一些潛在的坑需要注意,本文將深入探討Spring Boot中使用@Async注解時可能遇到的8大坑點,并提供相應(yīng)的解決方案
    2024-03-03
  • 深入解析Apache Kafka實時流處理平臺

    深入解析Apache Kafka實時流處理平臺

    這篇文章主要為大家介紹了Apache Kafka實時流處理平臺深入解析,從基本概念到實戰(zhàn)操作詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Java中的HashMap弱引用之WeakHashMap詳解

    Java中的HashMap弱引用之WeakHashMap詳解

    這篇文章主要介紹了Java中的HashMap弱引用之WeakHashMap詳解,當(dāng)內(nèi)存空間不足,Java虛擬機(jī)寧愿拋出OutOfMemoryError錯誤,使程序異常終止,也不會靠隨意回收具有強(qiáng)引用的對象來解決內(nèi)存不足的問題,需要的朋友可以參考下
    2023-09-09
  • SpringBoot中使用WebSocket的教程分享

    SpringBoot中使用WebSocket的教程分享

    這篇文章主要為大家詳細(xì)介紹了如何在SpringBoot中使用WebSocket,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,感興趣的小伙伴可以了解一下
    2023-06-06
  • Java實現(xiàn)滑動驗證碼(前端部分)

    Java實現(xiàn)滑動驗證碼(前端部分)

    這篇文章主要為大家介紹了如何用Java語言實現(xiàn)滑動驗證碼的生成(前端部分),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,感興趣的小伙伴可以跟隨小編學(xué)習(xí)一下
    2022-10-10
  • 詳解SpringBoot之集成Spring AOP

    詳解SpringBoot之集成Spring AOP

    本篇文章主要介紹了詳解SpringBoot之集成Spring AOP,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • 詳解如何在Java中實現(xiàn)屏幕共享

    詳解如何在Java中實現(xiàn)屏幕共享

    在本文中,將為大家展示如何利用 JxBrowser 的功能,實現(xiàn)運(yùn)行在不同電腦上的兩個 Java 應(yīng)用程序之間的屏幕共享,感興趣的小伙伴可以參考一下
    2024-10-10

最新評論

定日县| 阿拉尔市| 永平县| 迭部县| 临邑县| 北京市| 噶尔县| 唐山市| 青冈县| 石门县| 年辖:市辖区| 新闻| 林西县| 瑞金市| 澄迈县| 慈利县| 义马市| 宁都县| 襄垣县| 苍南县| 汾阳市| 英吉沙县| 天气| 治多县| 钟山县| 连云港市| 葫芦岛市| 都安| 科技| 扎囊县| 乐安县| 开鲁县| 化州市| 瑞金市| 岐山县| 五莲县| 静宁县| 怀宁县| 泸水县| 木兰县| 灵川县|