策略模式和工厂模式都是设计模式,但是它们的关注点不同。工厂模式关注的是对象创建,而策略模式关注的是算法多样性 。
策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,并将每个算法封装在一个具有共同接口的独立类中,使得它们可以相互替换,策略模式让算法的变化独立于使用它们的客户端。
策略模式的主要角色有以下几个:
1、抽象策略(Strategy):定义所有支持的算法的公共接口,包括一个执行算法的方法。
2、具体策略(ConcreteStrategy):实现抽象策略中的抽象方法,提供具体的算法实现。
3、上下文(Context):持有一个策略类的引用,在运行时根据需要选择具体策略对象。
4、客户端(Client):使用上下文对象调用具体策略的方法。
下面我们通过一个简单的例子来演示策略模式的使用,假设我们有一个购物系统,需要根据用户的购买金额来计算折扣,我们可以使用策略模式来实现这个功能。
我们定义一个抽象策略类DiscountStrategy
,它包含一个计算折扣的方法calculateDiscount
:
public interface DiscountStrategy { int calculateDiscount(int totalPrice); }
我们实现两个具体的折扣策略类:NoDiscountStrategy
和TenPercentDiscountStrategy
:
public class NoDiscountStrategy implements DiscountStrategy { @Override public int calculateDiscount(int totalPrice) { return totalPrice; } } public class TenPercentDiscountStrategy implements DiscountStrategy { @Override public int calculateDiscount(int totalPrice) { return totalPrice * 0.9; } }
我们创建一个上下文类ShoppingCart
,它持有一个DiscountStrategy
类型的引用,并提供一个设置折扣策略的方法setDiscountStrategy
:
public class ShoppingCart { private DiscountStrategy discountStrategy; public void setDiscountStrategy(DiscountStrategy discountStrategy) { this.discountStrategy = discountStrategy; } public int getTotalPrice() { // 这里只是一个示例,实际应用中可能需要从购物车中获取商品价格列表等信息 return 100; } public int calculateDiscountedPrice() { return discountStrategy.calculateDiscount(getTotalPrice()); } }
我们在客户端代码中使用ShoppingCart
和不同的折扣策略:
public class Client { public static void main(String[] args) { ShoppingCart shoppingCart = new ShoppingCart(); shoppingCart.setDiscountStrategy(new NoDiscountStrategy()); // 不打折 System.out.println("不打折的总价为:" + shoppingCart.calculateDiscountedPrice()); // 输出:不打折的总价为:100 shoppingCart.setDiscountStrategy(new TenPercentDiscountStrategy()); // 打九折 System.out.println("打九折的总价为:" + shoppingCart.calculateDiscountedPrice()); // 输出:打九折的总价为:90 } }
通过这个例子,我们可以看到策略模式的优点:当需要改变折扣算法时,只需要修改上下文类中的策略对象即可,而不需要修改使用该算法的所有客户端代码,这样可以降低系统的耦合度,提高可维护性。