策略模式和工厂模式都是设计模式中的通用解决方案,但是它们的关注点不同。工厂模式关注对象创建,而策略模式关注算法多样性 。
策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,并将每个算法封装在一个具有共同接口的独立类中,使得它们可以相互替换,策略模式让算法的变化独立于使用它们的客户端。
在计算机科学中,策略模式主要用于解决当一个系统中存在多种算法或策略时,如何将这些算法或策略封装起来,使得它们可以相互替换的问题,这种模式的主要优点是可以在不修改原有代码的情况下,轻松地更换算法或策略,从而提高系统的可扩展性和可维护性。
策略模式的核心思想是将算法的定义和使用分离开来,将算法封装在独立的类中,然后通过一个统一的接口来调用这些类,这样,当我们需要更换算法时,只需要替换实现该接口的类即可,而不需要修改其他部分的代码。
下面我们通过一个简单的例子来说明策略模式的使用:
假设我们有一个电商系统,需要根据不同的促销活动计算商品的价格,在这个例子中,我们可以使用策略模式来定义不同的计算价格的策略,如满减、打折等。
我们定义一个策略接口:
public interface DiscountStrategy { double getDiscountedPrice(double originalPrice); }
我们为每种促销活动实现这个接口:
public class FullReductionStrategy implements DiscountStrategy { @Override public double getDiscountedPrice(double originalPrice) { return originalPrice; // 满减优惠,无需折扣 } } public class DiscountStrategy implements DiscountStrategy { private int discount; // 折扣力度,如1表示9折,2表示8折 public DiscountStrategy(int discount) { this.discount = discount; } @Override public double getDiscountedPrice(double originalPrice) { return originalPrice * (10 - discount) / 10; // 按折扣力度计算折扣后的价格 } }
我们需要一个上下文类来管理这些策略:
public class PriceContext { private DiscountStrategy discountStrategy; // 存储当前使用的折扣策略 public void setDiscountStrategy(DiscountStrategy discountStrategy) { this.discountStrategy = discountStrategy; } public double getPrice(double originalPrice) { return discountStrategy.getDiscountedPrice(originalPrice); // 根据当前的折扣策略计算价格 } }
我们可以在客户端代码中使用这个上下文类来计算商品价格:
public class Client { public static void main(String[] args) { PriceContext priceContext = new PriceContext(); // 创建价格上下文对象 double originalPrice = 100; // 原价为100元的商品 double discountedPrice1 = priceContext.getPrice(originalPrice); // 不使用任何折扣策略,原价购买商品 System.out.println("原价:" + discountedPrice1); // 输出:原价:100.00元 priceContext.setDiscountStrategy(new FullReductionStrategy()); // 将折扣策略设置为满减优惠策略,无需折扣 double discountedPrice2 = priceContext.getPrice(originalPrice); // 按照满减优惠策略计算价格,无需折扣,价格仍为100元 System.out.println("满减优惠:" + discountedPrice2); // 输出:满减优惠:100.00元 priceContext.setDiscountStrategy(new DiscountStrategy(2)); // 将折扣策略设置为8折优惠策略,需支付20%的折扣后的价格为80元 double discountedPrice3 = priceContext.getPrice(originalPrice); // 按照8折优惠策略计算价格,需支付20%的折扣后的价格为80元 System.out.println("8折优惠:" + discountedPrice3); // 输出:8折优惠:80.00元 } }
通过以上示例,我们可以看到策略模式可以帮助我们将不同类型的算法封装起来,使得它们可以相互替换,当需要更换算法时,只需要替换实现该接口的类即可,而不需要修改其他部分的代码,这大大提高了系统的可扩展性和可维护性。