策略模式和工厂模式都是设计模式,但是它们的关注点不同。工厂模式关注的是对象的创建,而策略模式关注的是算法的多样性。 ,,工厂模式有三种类型:简单工厂、工厂方法和抽象工厂。简单工厂是最简单的一种,它只能生产一个产品;工厂方法是一种比较常见的方式,它通过传入参数来决定要生产哪个产品;抽象工厂则可以生产多个产品,但是每个产品都需要单独的工厂来生产。,,策略模式则是将算法封装、分离和替换,实现开闭原则。它可以在运行时动态切换不同的算法或策略。
策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,并将每个算法封装在一个具有共同接口的类中,使得它们可以相互替换,策略模式让算法独立于使用它的客户端。
策略模式的主要优点如下:
1、提高了代码的可复用性:通过将算法封装在独立的类中,可以在不修改原有代码的基础上,轻松地替换掉某个算法。
2、降低了系统的耦合度:策略模式使得各个策略之间的交互变得简单,从而降低了系统的耦合度。
3、便于维护:当需要修改某个算法时,只需修改对应的策略类,而不需要修改使用该算法的客户端代码。
下面我们通过一个简单的实例来说明策略模式的用法:
假设我们有一个电商系统,需要根据不同的促销活动计算商品的价格,目前有三种促销活动:满减、打折和免邮,我们需要根据用户选择的活动类型,计算出商品的实际价格。
我们定义一个抽象策略类DiscountStrategy
,它包含了计算折扣价格的方法:
public abstract class DiscountStrategy { public abstract double getDiscountedPrice(double originalPrice); }
我们分别实现三种促销活动对应的策略类:
1、满减策略类FullReductionStrategy
:
public class FullReductionStrategy extends DiscountStrategy { @Override public double getDiscountedPrice(double originalPrice) { return originalPrice; // 不打折,直接返回原价 } }
2、打折策略类DiscountStrategy
:
public class DiscountStrategy extends DiscountStrategy { private double discountRate; // 折扣率,如0.8表示8折 public DiscountStrategy(double discountRate) { this.discountRate = discountRate; } @Override public double getDiscountedPrice(double originalPrice) { return originalPrice * discountRate; // 根据折扣率计算折扣后的价格 } }
3、免邮策略类NoShippingStrategy
:
public class NoShippingStrategy extends DiscountStrategy { @Override public double getDiscountedPrice(double originalPrice) { return originalPrice; // 不打折也不免邮,直接返回原价 } }
我们需要定义一个上下文类ShoppingCart
,它包含了商品原价、优惠策略等信息,以及一个方法calculateTotalPrice()
用于计算购物车中所有商品的总价:
public class ShoppingCart { private List<Item> items; // 购物车中的商品列表 private DiscountStrategy discountStrategy; // 优惠策略,可以根据需要动态切换 public ShoppingCart(List<Item> items) { this.items = items; } public void setDiscountStrategy(DiscountStrategy discountStrategy) { this.discountStrategy = discountStrategy; } public double calculateTotalPrice() { double totalPrice = items.stream().mapToDouble(Item::getOriginalPrice).sum(); // 所有商品原价之和 if (discountStrategy instanceof FullReductionStrategy || discountStrategy instanceof NoShippingStrategy) { // 如果没有使用优惠策略或免邮策略,直接返回总价 return totalPrice; } else if (discountStrategy instanceof DiscountStrategy) { // 如果使用了打折策略,先计算折扣后的价格,再加上免邮费用(假设免邮费为10元),最后得到总价 double discountedPrice = discountStrategy.getDiscountedPrice(totalPrice); // 根据折扣率计算折扣后的价格 return discountedPrice + getShippingFee(); // 加上免邮费,得到总价 } else { // 其他情况(无效的优惠策略),直接返回原价作为总价的近似值(实际情况下应抛出异常或进行处理) return totalPrice; } } }
我们可以通过以下方式使用策略模式:
public static void main(String[] args) { List<Item> items = new ArrayList<>(); // ...添加购物车中的商品到items列表中... ShoppingCart shoppingCart = new ShoppingCart(items); // ...创建购物车对象... int promotionType = // ...根据用户选择的活动类型设置promotionType的值...; // 如0表示满减,1表示打折,2表示免邮,如果选择了无效的活动类型,promotionType应为-1。 int shippingType = // ...根据用户的收货地址设置shippingType的值...; // 如0表示普通快递,1表示顺丰特惠等,如果选择了无效的收货类型,shippingType应为-1,或者直接使用固定值1作为免邮费,如果使用了无效的收货类型或免邮类型,应抛出异常或进行处理,否则,应将shippingType设置为1,注意,这里假设了免邮费为10元,如果实际情况不同,请相应修改代码。