策略模式和工厂模式都是为了提高代码灵活性和可维护性。工厂模式关注对象创建,而策略模式关注算法多样性。
在软件开发中,设计模式是一种被广泛接受和应用的解决方案,它可以帮助我们解决复杂的问题,策略模式是23种设计模式之一,它定义了一系列算法,并将每个算法封装在一个具有共同接口的独立类中,使得它们可以相互替换,策略模式让算法的变化独立于使用它的客户端。
策略模式的主要优点如下:
1、提高了代码的可复用性:通过将算法封装在独立的类中,我们可以在不影响其他部分的情况下更换算法。
2、提高了代码的可维护性:当需要修改算法时,我们只需要修改实现算法的类,而不需要修改使用算法的代码。
3、提高了代码的可扩展性:策略模式支持多种算法,可以根据需要随时添加新的算法。
下面我们通过一个实例来说明策略模式的使用,假设我们需要开发一个购物系统,这个系统有一个功能是根据用户的消费金额给予不同的折扣,我们可以使用策略模式来实现这个功能。
我们需要定义一个策略接口,这个接口包含一个方法,用于计算折扣后的价格,我们需要为每种折扣类型实现这个接口,我们需要创建一个上下文对象,这个对象持有一个策略接口的引用,并提供一个方法,用于设置策略接口的引用。
public interface DiscountStrategy { double calculateDiscountedPrice(double originalPrice); } public class NoDiscountStrategy implements DiscountStrategy { @Override public double calculateDiscountedPrice(double originalPrice) { return originalPrice; } } public class TenPercentDiscountStrategy implements DiscountStrategy { @Override public double calculateDiscountedPrice(double originalPrice) { return originalPrice * 0.9; } }
我们需要创建一个上下文对象,这个对象持有一个策略接口的引用,并提供一个方法,用于设置策略接口的引用。
public class ShoppingContext { private DiscountStrategy discountStrategy; public void setDiscountStrategy(DiscountStrategy discountStrategy) { this.discountStrategy = discountStrategy; } public double getDiscountedPrice(double originalPrice) { return discountStrategy.calculateDiscountedPrice(originalPrice); } }
我们可以在客户端代码中使用这个上下文对象来获取折扣后的价格。
public class Main { public static void main(String[] args) { ShoppingContext shoppingContext = new ShoppingContext(); shoppingContext.setDiscountStrategy(new NoDiscountStrategy()); // 不打折 System.out.println("原价:" + shoppingContext.getDiscountedPrice(100)); // 原价:100.0 shoppingContext.setDiscountStrategy(new TenPercentDiscountStrategy()); // 打九折 System.out.println("原价:" + shoppingContext.getDiscountedPrice(100)); // 原价:90.0 } }
通过以上示例,我们可以看到策略模式如何帮助我们实现代码的复用、可维护和可扩展。