策略设计模式是行为设计模式之一。当我们为特定任务使用多个算法时,使用策略模式,客户端决定在运行时使用的实际实现。
策略模式的最佳示例之一是Collections.sort()采用Comparator参数的方法。基于Comparator接口的不同实现,对象将以不同的方式进行排序。
对于我们的示例,我们将尝试实施一个简单的购物车,我们有两种付款策略 - 使用信用卡或使用PayPal。
首先,我们将为我们的策略模式示例创建接口,在我们的例子中,支付金额作为参数传递。
支付方式:PaymentStrategy.java
package com.journaldev.design.strategy;public interface PaymentStrategy {public void pay(int amount);}
现在我们将不得不使用信用卡/借记卡或通过PayPal为支付创建具体的算法实现。
信用卡付款: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;}@Overridepublic 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;}@Overridepublic 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 itemsList<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 paypalcart.pay(new PaypalStrategy("myemail@example.com", "mypwd"));//pay by credit cardcart.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
联系客服