策略设计模式是行为设计模式之一。当咱们为特定任务使用多个算法时,使用策略模式,客户端决定在运行时使用的实际实现。java
策略模式的最佳示例之一是Collections.sort()采用Comparator参数的方法。基于Comparator接口的不一样实现,对象将以不一样的方式进行排序。算法
对于咱们的示例,咱们将尝试实施一个简单的购物车,咱们有两种付款策略 - 使用信用卡或使用PayPal。设计模式
首先,咱们将为咱们的策略模式示例建立接口,在咱们的例子中,支付金额做为参数传递。
支付方式:PaymentStrategy.javaide
package com.journaldev.design.strategy; public interface PaymentStrategy { public void pay(int amount); }
如今咱们将不得不使用信用卡/借记卡或经过PayPal为支付建立具体的算法实现。测试
信用卡付款:CreditCardStrategy.javathis
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.javacode
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); } }
请注意,购物车的付款方式须要付款算法做为参数,而且不会将其做为实例变量存储在任何位置。orm
让咱们用一个简单的程序测试咱们的策略模式示例设置。
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
这就是java中的Strategy Pattern,我但愿你喜欢它。
翻译于:strategy-design-pattern-in-java