Java中策略設(shè)計模式的實現(xiàn)及應(yīng)用場景
介紹
Java策略模式(Strategy Pattern)是一種行為設(shè)計模式,它允許再運行時動態(tài)選擇算法的行為.策略模式通過將算法封裝在可互換的策略對象中,使得客戶端代碼能夠輕松地切換算法,而無需修改原始代碼.在策略模式中,每個算法都被實現(xiàn)為一個單獨的策略類,這些策略類都實現(xiàn)了相同的接口,從而允許它們在運行時互相替換.
在Java中,可以使用接口或抽象類來定義策略接口.然后對于每個算法,都可以創(chuàng)建一個具體的實現(xiàn)類來實現(xiàn)這個接口.客戶端代碼可以通過將不同的策略對象傳遞給上下文對象來選擇不同的算法.
Java策略模式通常包括以下三種角色:
- Context(上下文):是策略模式中的核心類,用來管理具體策略實現(xiàn)類的創(chuàng)建,配置和執(zhí)行,以及在運行時動態(tài)地選擇具體的策略實現(xiàn)類.
- Strategy(策略):是一個接口或抽象類,定義了策略實現(xiàn)類的通用方法和屬性,具體策略實現(xiàn)類必須實現(xiàn)這些方法和屬性.
- ConcreteStrategy(具體策略):是策略接口的實現(xiàn)類,根據(jù)具體業(yè)務(wù)需求實現(xiàn)了策略接口定義的方法和屬性.可以又多個具體策略實現(xiàn)類,Context類在運行時根據(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進行支付,并調(diào)用pay()方法.我們接下來又選擇使用WechatPayment進行支付,并再次調(diào)用pay()方法.
這樣,我們就可以輕松地在不同的支付方式之間進行切換,并根據(jù)需要添加新的支付方式.
總結(jié)
優(yōu)點
- 容易擴展和維護:通過定義一個抽象的策略接口,可以方便地增加新的策略實現(xiàn)類,而不需要修改現(xiàn)有代碼
- 易于替換算法:在運行時可以動態(tài)地切換算法實現(xiàn),無需修改客戶端代碼
- 降低了耦合度:客戶端只需要知道策略接口即可,不需要知道具體的策略實現(xiàn)類
- 提高了復(fù)用性:不同的策略實現(xiàn)類可以在多個場景下復(fù)用
缺點
- 增加了類的數(shù)量:為每個具體策略都定義了一個實現(xiàn)類,可能會增加類的數(shù)量.
- 客戶端必須知道策略接口:客戶端需要知道具體的策略接口,才能正確使用策略實現(xiàn)類.
- 運行時開銷較大:在運行時,需要根據(jù)不同的策略實現(xiàn)類進行判斷和選擇,會帶來一定的開銷
應(yīng)用場景
- 有多個相似的類,只有行為有差異的情況下,可以考慮使用策略模式.
- 需要在運行時動態(tài)切換算法的情況下,可以使用策略模式.
- 一個系統(tǒng)需要在不同時間應(yīng)用不同的業(yè)務(wù)規(guī)則情況下,可以使用策略模式
- 在一個系統(tǒng)中,有許多類需要根據(jù)某種規(guī)則進行排序,查找等操作的情況下,可以使用策略模式.
到此這篇關(guān)于Java中策略設(shè)計模式的實現(xiàn)及應(yīng)用場景的文章就介紹到這了,更多相關(guān)Java策略設(shè)計模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java處理時間格式CST和GMT轉(zhuǎn)換方法示例
這篇文章主要給大家介紹了關(guān)于Java處理時間格式CST和GMT轉(zhuǎn)換方法的相關(guān)資料,相信很多小伙伴在時間格式轉(zhuǎn)換的時候非常頭疼,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2023-09-09Spring Boot緩存實戰(zhàn) Caffeine示例
本篇文章主要介紹了Spring Boot緩存實戰(zhàn) Caffeine示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-02-02解決MyEclipse出現(xiàn)the user operation is waiting的問題
今天做項目的時候每次修改代碼保存后都會跳出一個框框,然后就有兩個進度條,上面寫the user operation is wating...小編去網(wǎng)上查了查解決了這個問題,下面跟大家分享一下。2018-04-04SpringBoot整合Mybatis Plus多數(shù)據(jù)源的實現(xiàn)示例
本文主要介紹了SpringBoot整合Mybatis Plus多數(shù)據(jù)源的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11使用@PathVariable時候無法將參數(shù)映射到變量中的解決
這篇文章主要介紹了使用@PathVariable時候無法將參數(shù)映射到變量中的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08