策略模式和工厂模式都是常见的设计模式,它们的区别在于关注点不同。工厂模式主要关注对象的创建,而策略模式则关注算法多样性 。
在软件开发过程中,我们经常会遇到这样的问题:在不同的场景下,我们需要执行相同的操作,但是操作的具体实现方式可能有所不同,这时,我们可以使用策略模式来解决这个问题,策略模式是一种行为设计模式,它将一组行为封装到一系列的策略类中,使得这些行为可以相互替换,这样,我们就可以根据需要灵活地选择和切换不同的策略,而不需要修改客户端代码。
策略模式的核心思想是定义一系列的算法,并将每一个算法封装起来,使它们可以相互替换,策略模式让算法的变化独立于使用它们的客户端。
下面我们通过一个简单的例子来说明策略模式的用法:
假设我们有一个电商系统,现在需要对购买的商品进行折扣处理,我们可以根据不同的折扣规则(如满减、打折等)来实现不同的折扣策略,我们定义一个折扣策略接口:
public interface DiscountStrategy { double getDiscountedPrice(double originalPrice); }
我们为每种折扣规则实现这个接口:
public class FullReductionStrategy implements DiscountStrategy { @Override public double getDiscountedPrice(double originalPrice) { return originalPrice; } } public class DiscountStrategyA implements DiscountStrategy { @Override public double getDiscountedPrice(double originalPrice) { return originalPrice * 0.9; } } public class DiscountStrategyB implements DiscountStrategy { @Override public double getDiscountedPrice(double originalPrice) { return originalPrice * 0.8; } }
我们需要一个上下文类来管理这些折扣策略:
public class ShoppingCartContext { private DiscountStrategy discountStrategy; public void setDiscountStrategy(DiscountStrategy discountStrategy) { this.discountStrategy = discountStrategy; } public double calculateTotalPrice(List<Item> items) { double totalPrice = 0; for (Item item : items) { totalPrice += item.getOriginalPrice(); } return discountStrategy.getDiscountedPrice(totalPrice); } }
我们在客户端代码中使用这个上下文类来实现不同的折扣策略:
public class Client { public static void main(String[] args) { ShoppingCartContext shoppingCartContext = new ShoppingCartContext(); List<Item> items = new ArrayList<>(); // 这里添加购物车中的商品列表 double totalPrice = shoppingCartContext.calculateTotalPrice(items); // 计算总价并输出结果 } }
通过这种方式,我们可以在不修改客户端代码的情况下,轻松地切换不同的折扣策略,这就是策略模式的优势所在。