电子商务网站设计物流方案,做国内第一游戏数据门户网站,中式风格装修效果图,源码编辑器策略设计模式是行为设计模式之一。当我们为特定任务使用多个算法时#xff0c;使用策略模式#xff0c;客户端决定在运行时使用的实际实现。策略模式的最佳示例之一是Collections.sort()采用Comparator参数的方法。基于Comparator接口的不同实现#xff0c;对象将以不同的方…策略设计模式是行为设计模式之一。当我们为特定任务使用多个算法时使用策略模式客户端决定在运行时使用的实际实现。策略模式的最佳示例之一是Collections.sort()采用Comparator参数的方法。基于Comparator接口的不同实现对象将以不同的方式进行排序。2|0实例对于我们的示例我们将尝试实施一个简单的购物车我们有两种付款策略 - 使用信用卡或使用PayPal。首先我们将为我们的策略模式示例创建接口在我们的例子中支付金额作为参数传递。支付方式PaymentStrategy.javapackage com.journaldev.design.strategy;public interface PaymentStrategy {public void pay(int amount);}现在我们将不得不使用信用卡/借记卡或通过PayPal为支付创建具体的算法实现。信用卡付款CreditCardStrategy.javapackage 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.namenm;this.cardNumberccNum;this.cvvcvv;this.dateOfExpiryexpiryDate;}Overridepublic void pay(int amount) {System.out.println(amount paid with credit/debit card);}}Paypal付款PaypalStrategy.javapackage com.journaldev.design.strategy;public class PaypalStrategy implements PaymentStrategy {private String emailId;private String password;public PaypalStrategy(String email, String pwd){this.emailIdemail;this.passwordpwd;}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.upcCodeupc;this.pricecost;}public String getUpcCode() {return upcCode;}public int getPrice() {return price;}}ShoppingCart.javapackage com.journaldev.design.strategy;import java.text.DecimalFormat;import java.util.ArrayList;import java.util.List;public class ShoppingCart {//List of itemsList items;public ShoppingCart(){this.itemsnew ArrayList();}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.javapackage 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(myemailexample.com, mypwd));//pay by credit cardcart.pay(new CreditCardStrategy(Pankaj Kumar, 1234567890123456, 786, 12/15));}}上述程序的输出是50 paid using Paypal.50 paid with credit/debit card3|0类图4|0总结我们可以使用组合为策略创建实例变量但我们应该避免这种情况因为我们希望将特定策略应用于特定任务。在Collections.sort()和Arrays.sort()方法中遵循相同的方法将比较器作为参数。策略模式与状态模式(State Pattern)非常相似。其中一个区别是Context包含状态作为实例变量并且可以有多个任务其实现可以依赖于状态而策略模式策略作为参数传递给方法上下文对象没有任何变量来存储它。当我们为特定任务提供多个算法时策略模式很有用我们希望我们的应用程序可以灵活地在运行时为特定任务选择任何算法。优点1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。缺点1、策略类会增多。 2、所有策略类都需要对外暴露。主要解决在有多种算法相似的情况下使用 if...else 所带来的复杂和难以维护。何时使用一个系统有许多许多类而区分它们的只是他们直接的行为。如何解决将这些算法封装成一个一个的类任意地替换。关键代码实现同一个接口。使用场景 1、如果在一个系统里面有许多类它们之间的区别仅在于它们的行为那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中选择一种。 3、如果一个对象有很多的行为如果不用恰当的模式这些行为就只好使用多重的条件选择语句来实现。注意事项如果一个系统的策略多于四个就需要考虑使用混合模式解决策略类膨胀的问题。这就是java中的Strategy Pattern我希望你喜欢它。翻译于strategy-design-pattern-in-java__EOF__