策略模式和状态模式都是行为设计模式,它们的区别如下: ,,- 状态模式重点在各状态之间的切换,从而做不同的事情;而策略模式更侧重于根据具体情况选择策略,并不涉及切换。,- 状态模式不同状态下做的事情不同,而策略模式做的都是同一件事。,- 状态模式封装了对象的状态,而策略模式封装算法或策略。因为状态是跟对象密切相关的,它不能被重用;而策略模式通过从Context中分离出策略或算法,我们可以重用它们。
策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,并将每个算法封装在一个具有共同接口的独立类中,使得它们可以相互替换,策略模式让算法的变化独立于使用它的客户端。
在编程中,我们经常需要根据不同的情况选择不同的处理方式,例如在排序算法、支付方式、加密算法等场景中,我们都可能会使用到策略模式。
下面我们通过一个简单的实例来详细解读策略模式。
假设我们正在编写一个在线购物系统,我们需要对用户的购买金额进行折扣处理,我们可以使用策略模式来实现这个需求。
我们需要定义一个折扣策略接口,所有的折扣策略都需要实现这个接口:
public interface DiscountStrategy { double getDiscountedPrice(double originalPrice); }
我们可以定义几个具体的折扣策略,例如满100减20,满200减50等:
public class FullReductionStrategy implements DiscountStrategy { @Override public double getDiscountedPrice(double originalPrice) { if (originalPrice >= 100) { return originalPrice - 20; } else { return originalPrice; } } } public class HalfReductionStrategy implements DiscountStrategy { @Override public double getDiscountedPrice(double originalPrice) { if (originalPrice >= 200) { return originalPrice * 0.5; } else { return originalPrice; } } }
我们需要定义一个上下文类,这个类包含了一个折扣策略的引用,以及一个计算折扣后价格的方法:
public class ShoppingCart { private DiscountStrategy discountStrategy; public void setDiscountStrategy(DiscountStrategy discountStrategy) { this.discountStrategy = discountStrategy; } public double calculateTotalPrice(double originalPrice) { return discountStrategy.getDiscountedPrice(originalPrice); } }
我们可以在客户端代码中使用策略模式来实现购物车的折扣功能:
public class Client { public static void main(String[] args) { ShoppingCart shoppingCart = new ShoppingCart(); shoppingCart.setDiscountStrategy(new FullReductionStrategy()); // 或者 new HalfReductionStrategy() double totalPrice = shoppingCart.calculateTotalPrice(300); // 这个价格会根据具体使用的折扣策略而变化 System.out.println("The discounted price is " + totalPrice); // 如果使用的是满100减20的策略,输出的结果应该是280;如果使用的是满200减50的策略,输出的结果应该是150。 } }
就是策略模式的一个简单示例,通过这种方式,我们可以在不修改原有代码的情况下,轻松地添加新的折扣策略,从而实现了代码的灵活性和可维护性。