策略模式和工厂模式都是设计模式,但是它们的关注点不同。工厂模式关注对象的创建,而策略模式关注行为的封装。
策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,并将每个算法封装在一个具有共同接口的独立类中,使得它们可以相互替换,策略模式让算法的变化独立于使用它们的客户端。
策略模式的主要角色包括:
1、抽象策略(Strategy):定义所有支持的算法的公共接口。
2、具体策略(Concrete Strategy):实现抽象策略中的操作,即具体的算法实现。
3、上下文(Context):持有一个策略对象的引用,提供给客户端使用。
下面我们通过一个简单的例子来说明策略模式的使用。
假设我们有一个电商系统,需要根据不同的促销策略计算商品的价格,我们可以使用策略模式来实现这个功能。
我们需要定义一个抽象策略,表示不同的促销策略:
public interface PromotionStrategy { double calculatePrice(double originalPrice); }
我们需要实现具体的促销策略,我们可以实现一个满减策略和一个折扣策略:
public class FullReductionStrategy implements PromotionStrategy { @Override public double calculatePrice(double originalPrice) { return originalPrice; } } public class DiscountStrategy implements PromotionStrategy { private double discount; public DiscountStrategy(double discount) { this.discount = discount; } @Override public double calculatePrice(double originalPrice) { return originalPrice * (1 - discount); } }
我们需要创建一个上下文类,用于保存当前使用的策略对象:
public class ShoppingCart { private PromotionStrategy promotionStrategy; public void setPromotionStrategy(PromotionStrategy promotionStrategy) { this.promotionStrategy = promotionStrategy; } public double getFinalPrice(double originalPrice) { return promotionStrategy.calculatePrice(originalPrice); } }
我们可以在客户端代码中使用策略模式:
public class Client { public static void main(String[] args) { ShoppingCart shoppingCart = new ShoppingCart(); shoppingCart.setPromotionStrategy(new FullReductionStrategy()); // 使用满减策略计算价格 System.out.println("满减后的价格为:" + shoppingCart.getFinalPrice(100)); // 输出:满减后的价格为:100.0 ; shoppingCart.setPromotionStrategy(new DiscountStrategy(0.8)); // 使用折扣策略计算价格(8折) System.out.println("8折后的价格为:" + shoppingCart.getFinalPrice(100)); // 输出:8折后的价格为:80.0 } }
通过以上示例,我们可以看到策略模式可以帮助我们实现不同算法之间的解耦,使得在不影响客户端的情况下,可以方便地更换算法,策略模式也提高了代码的可扩展性和可维护性。