策略模式和状态模式都是设计模式中的行为型模式。策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。而状态模式是在状态机的基础上进行的设计,它将一个对象的状态转换看作一个过程,这个过程由一系列的状态组成。状态模式通过状态之间的转移来实现不同的行为,每个状态都有自己的行为 。
在软件开发过程中,我们经常会遇到各种不同的需求和问题,我们需要根据不同的条件来执行不同的操作,这时,策略模式就显得尤为重要,策略模式是一种行为设计模式,它允许你在运行时根据需要选择算法或策略,这种模式可以让你的代码更加灵活、可扩展和可维护。
策略模式的核心思想是将算法封装到具有共同接口的独立的类中,使得它们可以相互替换,这样,当我们需要改变算法时,只需要更换相应的类即可,而不需要修改使用这些算法的代码,策略模式可以帮助我们在不修改原有代码的基础上,实现代码的复用和扩展。
下面我们通过一个简单的例子来了解策略模式的用法,假设我们有一个电商系统,需要根据用户的购物车中的商品数量来计算优惠价格,我们可以使用策略模式来实现这个功能。
我们定义一个策略接口,用于描述计算优惠价格的方法:
public interface DiscountStrategy { double getDiscountedPrice(double originalPrice); }
我们创建几个实现该策略接口的具体策略类:
1、直接打折策略:所有商品直接打折;
2、满减策略:满足一定金额后减免;
3、买赠策略:购买指定数量的商品赠送其他商品。
public class DirectDiscountStrategy implements DiscountStrategy { @Override public double getDiscountedPrice(double originalPrice) { return originalPrice; } } public class FullReductionStrategy implements DiscountStrategy { private double threshold; // 满减阈值 public FullReductionStrategy(double threshold) { this.threshold = threshold; } @Override public double getDiscountedPrice(double originalPrice) { if (originalPrice >= threshold) { return originalPrice - threshold; } else { return originalPrice; } } } public class BuyGiveStrategy implements DiscountStrategy { private int buyCount; // 需要购买的数量 private int giveCount; // 需要赠送的数量 public BuyGiveStrategy(int buyCount, int giveCount) { this.buyCount = buyCount; this.giveCount = giveCount; } @Override public double getDiscountedPrice(double originalPrice) { if (originalPrice >= (buyCount + giveCount)) { return originalPrice * (buyCount + giveCount) * 0.9; // 每满一定金额,折扣为9折 } else { return originalPrice; } } }
我们创建一个上下文类,用于根据用户的需求选择合适的策略:
public class ShoppingCartContext { private DiscountStrategy discountStrategy; // 折扣策略对象,可以在运行时动态更改 public void setDiscountStrategy(DiscountStrategy discountStrategy) { this.discountStrategy = discountStrategy; } public double getDiscountedPrice(double originalPrice) { return discountStrategy.getDiscountedPrice(originalPrice); } }
在客户端代码中,我们可以根据用户的选择来设置不同的折扣策略:
public class Main { public static void main(String[] args) { ShoppingCartContext shoppingCart = new ShoppingCartContext(); // 创建购物车上下文对象,并设置默认的直接打折策略 shoppingCart.setDiscountStrategy(new DirectDiscountStrategy()); // 根据用户选择的直接打折策略计算优惠价格 System.out.println("直接打折后的价格:" + shoppingCart.getDiscountedPrice(100)); // 如果用户选择了直接打折策略,则输出优惠后的价格;否则输出原价100元。