策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,并将每个算法封装在一个具有共同接口的独立类中,使得它们可以相互替换,策略模式让算法的变化独立于使用它们的客户端。
在计算机科学中,策略模式主要用于解决同一问题在不同情况下有不同解决方案的问题,它可以将一组行为封装成一系列可互换的算法或策略,从而使得这些算法或策略可以动态地改变,而不需要修改使用它们的客户端代码。
策略模式的主要角色包括:
1、抽象策略(Strategy):定义所有支持的算法的公共接口。
2、具体策略(ConcreteStrategy):实现抽象策略的具体算法。
3、上下文(Context):持有一个策略对象的引用,供客户端调用。
以下是一个简单的策略模式示例:
假设我们有一个电商系统,需要根据不同的折扣政策计算商品的价格,我们可以使用策略模式来实现这个功能。
我们需要定义一个抽象策略,用于表示折扣政策:
public interface DiscountPolicy { double getDiscountedPrice(double originalPrice); }
我们可以为每种折扣政策创建一个具体策略类:
public class NoDiscountPolicy implements DiscountPolicy { @Override public double getDiscountedPrice(double originalPrice) { return originalPrice; } } public class HalfPriceDiscountPolicy implements DiscountPolicy { @Override public double getDiscountedPrice(double originalPrice) { return originalPrice * 0.5; } }
我们需要创建一个上下文类,用于保存当前使用的折扣策略,并提供一个方法来获取该策略:
public class ShoppingCart { private DiscountPolicy discountPolicy; public void setDiscountPolicy(DiscountPolicy discountPolicy) { this.discountPolicy = discountPolicy; } public double getTotalPrice() { double totalPrice = 0; for (Item item : items) { totalPrice += item.getPrice(); } return discountPolicy.getDiscountedPrice(totalPrice); } }
我们可以在客户端代码中使用策略模式来计算购物车中商品的总价:
public class Client { public static void main(String[] args) { ShoppingCart shoppingCart = new ShoppingCart(); shoppingCart.setDiscountPolicy(new NoDiscountPolicy()); // 不使用折扣,直接计算原价总和 System.out.println("原价总和:" + shoppingCart.getTotalPrice()); // 原价总和:100.00元 } }
通过这种方式,我们可以在不修改客户端代码的情况下,轻松地切换不同的折扣策略,这对于电商系统中的商品价格计算非常有用。