策略模式和工厂模式都是设计模式,但是它们的关注点不同。工厂模式关注对象创建,而策略模式关注算法多样性 。
策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,并将每个算法封装在一个具有共同接口的独立的类中,使得它们可以相互替换,策略模式让算法的变化独立于使用它们的客户端。
在计算机科学中,策略模式主要用于解决当一个系统中有多种算法或策略时,如何将这些算法或策略与使用它们的客户端分离开来的问题,这种模式可以让我们在不修改客户端代码的情况下,轻松地更换算法或策略。
策略模式的主要角色包括:
1、抽象策略(Strategy):定义所有支持的算法的公共接口。
2、具体策略(ConcreteStrategy):实现抽象策略中的操作,即具体的算法。
3、上下文(Context):持有一个策略对象的引用,用于调用其方法。
下面我们通过一个简单的例子来说明策略模式的使用,假设我们正在开发一个购物系统,需要根据用户的购物金额来计算折扣,我们可以使用策略模式来实现这个功能。
我们需要定义一个抽象策略,表示不同的折扣策略:
public interface DiscountStrategy { double getDiscount(double amount); }
我们需要实现具体策略,例如按照不同比例计算折扣:
public class NoDiscountStrategy implements DiscountStrategy { @Override public double getDiscount(double amount) { return amount; } } public class HalfPriceDiscountStrategy implements DiscountStrategy { @Override public double getDiscount(double amount) { return amount * 0.5; } }
我们需要创建一个上下文类,用于保存当前使用的策略,并提供获取和设置策略的方法:
public class ShoppingCart { private DiscountStrategy discountStrategy; public void setDiscountStrategy(DiscountStrategy strategy) { this.discountStrategy = strategy; } public double calculateTotalPrice(double amount) { return discountStrategy.getDiscount(amount); } }
我们可以在客户端代码中使用策略模式来实现不同的折扣策略:
public class Client { public static void main(String[] args) { ShoppingCart cart = new ShoppingCart(); cart.setDiscountStrategy(new NoDiscountStrategy()); // 不打折 System.out.println("原价:" + cart.calculateTotalPrice(100)); // 原价:100.0 cart.setDiscountStrategy(new HalfPriceDiscountStrategy()); // 按半价折扣 System.out.println("打折后:" + cart.calculateTotalPrice(100)); // 打折后:50.0 } }
通过以上示例,我们可以看到策略模式可以帮助我们实现算法的灵活切换,而无需修改客户端代码,这对于需要频繁更改算法的场景非常有用。