策略模式是一种行为设计模式,它定义了一系列算法,并将每个算法封装在一个具有共同接口的独立类中,使得它们可以相互替换。策略模式让算法的变化独立于使用它的客户端。在实践中,策略模式常用于处理不同的业务逻辑场景。相比之下,状态模式主要用于表示对象的状态和行为之间的动态转换。它通过将状态封装为单独的类来实现这一点。虽然两者都是设计模式,但它们的关注点和应用场景有所不同。
策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,并将每个算法封装在一个具有共同接口的类中,使得它们可以相互替换,策略模式让算法独立于使用它的客户端。
策略模式的主要优点如下:
1、提高了代码的可重用性:通过将算法封装在独立的类中,可以在不修改原有代码的基础上,轻松地更换算法实现。
2、降低了系统的耦合度:策略模式将算法与其调用者解耦,使得系统更加灵活,易于维护。
3、便于动态扩展:当需要添加新的算法时,只需增加一个新的类实现策略接口即可,无需修改原有代码。
下面我们通过一个简单的例子来说明策略模式的使用:
假设我们有一个电商系统,需要根据用户的购买金额来计算折扣,我们可以使用策略模式来实现这个功能,我们需要定义一个策略接口,然后为每种折扣类型实现该接口,在客户端代码中,只需要创建相应的策略对象即可。
// 策略接口 public interface DiscountStrategy { double getDiscount(double price); } // 直接折扣策略 public class DirectDiscountStrategy implements DiscountStrategy { @Override public double getDiscount(double price) { return price; } } // 积分折扣策略 public class PointDiscountStrategy implements DiscountStrategy { private int point; public PointDiscountStrategy(int point) { this.point = point; } @Override public double getDiscount(double price) { double discount = price * point; return Math.round(discount * 100) / 100; // 返回整数折扣后的价格 } }
在客户端代码中,我们可以根据用户的购买金额选择合适的折扣策略:
public class ShoppingCart { private List<Item> items; // 购物车中的商品列表 private DiscountStrategy discountStrategy; // 折扣策略对象 public ShoppingCart(List<Item> items) { this.items = items; // 根据用户设置的折扣策略创建折扣策略对象 if (userSettings.getDiscountType() == UserSettings.DiscountType.DIRECT_DISCOUNT) { discountStrategy = new DirectDiscountStrategy(); } else if (userSettings.getDiscountType() == UserSettings.DiscountType.POINT_DISCOUNT) { discountStrategy = new PointDiscountStrategy(userSettings.getPoint()); } else { throw new IllegalArgumentException("Invalid discount type"); } } public double calculateTotalPrice() { double totalPrice = 0; for (Item item : items) { totalPrice += item.getPrice() * discountStrategy.getDiscount(item.getPrice()); // 根据折扣策略计算商品的实际价格和总价 } return totalPrice; } }
通过以上示例,我们可以看到策略模式的优势,当我们需要添加新的折扣类型时,只需实现一个新的折扣策略类并将其注册到系统中,而无需修改原有代码,这样可以保证系统的可扩展性和可维护性。