Java通俗易懂系列設計模式之策略模式
介紹
策略設計模式是行為設計模式之一。當我們?yōu)樘囟ㄈ蝿帐褂枚鄠€算法時,使用策略模式,客戶端決定在運行時使用的實際實現。
策略模式的最佳示例之一是Collections.sort()采用Comparator參數的方法?;贑omparator接口的不同實現,對象將以不同的方式進行排序。
實例
對于我們的示例,我們將嘗試實施一個簡單的購物車,我們有兩種付款策略 - 使用信用卡或使用PayPal。
首先,我們將為我們的策略模式示例創(chuàng)建接口,在我們的例子中,支付金額作為參數傳遞。
支付方式:PaymentStrategy.java
package com.journaldev.design.strategy; public interface PaymentStrategy { public void pay(int amount); }
現在我們將不得不使用信用卡/借記卡或通過PayPal為支付創(chuàng)建具體的算法實現。
信用卡付款:CreditCardStrategy.java
package com.journaldev.design.strategy; public class CreditCardStrategy implements PaymentStrategy { private String name; private String cardNumber; private String cvv; private String dateOfExpiry; public CreditCardStrategy(String nm, String ccNum, String cvv, String expiryDate){ this.name=nm; this.cardNumber=ccNum; this.cvv=cvv; this.dateOfExpiry=expiryDate; } @Override public void pay(int amount) { System.out.println(amount +" paid with credit/debit card"); } }
Paypal付款:PaypalStrategy.java
package com.journaldev.design.strategy; public class PaypalStrategy implements PaymentStrategy { private String emailId; private String password; public PaypalStrategy(String email, String pwd){ this.emailId=email; this.password=pwd; } @Override public void pay(int amount) { System.out.println(amount + " paid using Paypal."); } }
現在我們的策略模式示例算法準備好了。我們可以實施購物車和付款方式將需要輸入作為付款策略。
package com.journaldev.design.strategy; public class Item { private String upcCode; private int price; public Item(String upc, int cost){ this.upcCode=upc; this.price=cost; } public String getUpcCode() { return upcCode; } public int getPrice() { return price; } }
ShoppingCart.java
package com.journaldev.design.strategy; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.List; public class ShoppingCart { //List of items List<Item> items; public ShoppingCart(){ this.items=new ArrayList<Item>(); } public void addItem(Item item){ this.items.add(item); } public void removeItem(Item item){ this.items.remove(item); } public int calculateTotal(){ int sum = 0; for(Item item : items){ sum += item.getPrice(); } return sum; } public void pay(PaymentStrategy paymentMethod){ int amount = calculateTotal(); paymentMethod.pay(amount); } }
請注意,購物車的付款方式需要付款算法作為參數,并且不會將其作為實例變量存儲在任何位置。
讓我們用一個簡單的程序測試我們的策略模式示例設置。
ShoppingCartTest.java
package com.journaldev.design.strategy; public class ShoppingCartTest { public static void main(String[] args) { ShoppingCart cart = new ShoppingCart(); Item item1 = new Item("1234",10); Item item2 = new Item("5678",40); cart.addItem(item1); cart.addItem(item2); //pay by paypal cart.pay(new PaypalStrategy("myemail@example.com", "mypwd")); //pay by credit card cart.pay(new CreditCardStrategy("Pankaj Kumar", "1234567890123456", "786", "12/15")); } }
上述程序的輸出是:
50 paid using Paypal.
50 paid with credit/debit card
類圖
總結
我們可以使用組合為策略創(chuàng)建實例變量,但我們應該避免這種情況,因為我們希望將特定策略應用于特定任務。在Collections.sort()和Arrays.sort()方法中遵循相同的方法,將比較器作為參數。
策略模式與狀態(tài)模式(State Pattern)非常相似。其中一個區(qū)別是Context包含狀態(tài)作為實例變量,并且可以有多個任務,其實現可以依賴于狀態(tài),而策略模式策略作為參數傳遞給方法,上下文對象沒有任何變量來存儲它。
當我們?yōu)樘囟ㄈ蝿仗峁┒鄠€算法時,策略模式很有用,我們希望我們的應用程序可以靈活地在運行時為特定任務選擇任何算法。
- 優(yōu)點:1、算法可以自由切換。2、避免使用多重條件判斷。3、擴展性良好。
- 缺點:1、策略類會增多。 2、所有策略類都需要對外暴露。
- 主要解決:在有多種算法相似的情況下,使用 if...else 所帶來的復雜和難以維護。
- 何時使用:一個系統有許多許多類,而區(qū)分它們的只是他們直接的行為。
- 如何解決:將這些算法封裝成一個一個的類,任意地替換。
- 關鍵代碼:實現同一個接口。
- 使用場景: 1、如果在一個系統里面有許多類,它們之間的區(qū)別僅在于它們的行為,那么使用策略模式可以動態(tài)地讓一個對象在許多行為中選擇一種行為。 2、一個系統需要動態(tài)地在幾種算法中選擇一種。 3、如果一個對象有很多的行為,如果不用恰當的模式,這些行為就只好使用多重的條件選擇語句來實現。
- 注意事項:如果一個系統的策略多于四個,就需要考慮使用混合模式,解決策略類膨脹的問題。
以上就是Java通俗易懂系列設計模式之策略模式的詳細內容,更多關于Java設計模式的資料請關注腳本之家其它相關文章!
相關文章
Java開發(fā)者就業(yè)需要掌握的9大專業(yè)技能
這篇文章主要為大家詳細介紹了java就業(yè)前需要掌握的專業(yè)技能,感興趣的小伙伴們可以參考一下2016-09-09Spring,hibernate,struts經典面試筆試題(含答案)
這篇文章主要介紹了Spring,hibernate,struts經典面試筆試題極其參考含答案,涉及SSH基本概念,原理與使用技巧,需要的朋友可以參考下2016-03-03SpringCloud之動態(tài)刷新、重試、服務化的實現
這篇文章主要介紹了SpringCloud 之動態(tài)刷新、重試、服務化的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-10-10