策略模式和工厂模式都是设计模式,但是它们的关注点不同。工厂模式关注对象创建,而策略模式关注算法多样性。工厂模式是一种创建对象的方式,使得创建对象的过程与使用对象的过程分离;而策略模式则是一种行为型设计模式,可以在运行时动态切换不同的算法或策略。
在软件开发中,我们经常面临这样一个问题:如何在不修改原有代码的基础上,为程序添加新的功能?这时,策略模式就显得尤为重要,策略模式是一种行为设计模式,它允许你在运行时根据不同的条件选择不同的算法或策略来执行,这种模式可以让你的代码更加灵活、可扩展和可维护。
让我们来了解一下什么是策略模式,策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装在一个具有共同接口的类中,使得它们可以相互替换,策略模式让算法的变化独立于使用它们的客户端。
策略模式的主要角色有以下几个:
1、抽象策略(Strategy):定义所有支持的算法的公共接口。
2、具体策略(ConcreteStrategy):实现抽象策略中的操作。
3、上下文(Context):持有一个策略类的引用,供客户端调用。
4、客户端(Client):使用上下文对象调用具体策略的方法。
下面,我们通过一个简单的例子来演示策略模式的使用,假设我们有一个电商系统,需要根据不同的促销活动计算优惠后的价格,我们可以使用策略模式来实现这个功能。
我们定义一个抽象策略类DiscountStrategy
,它包含一个计算折扣价格的方法calculatePrice
:
public interface DiscountStrategy { double calculatePrice(double originalPrice); }
我们实现两个具体的折扣策略类:NoDiscountStrategy
和TenPercentDiscountStrategy
:
public class NoDiscountStrategy implements DiscountStrategy { @Override public double calculatePrice(double originalPrice) { return originalPrice; } } public class TenPercentDiscountStrategy implements DiscountStrategy { @Override public double calculatePrice(double originalPrice) { return originalPrice * 0.9; } }
我们创建一个上下文类PromotionContext
,它持有一个DiscountStrategy
类型的引用,并提供一个方法setDiscountStrategy
来设置具体的折扣策略:
public class PromotionContext { private DiscountStrategy discountStrategy; public void setDiscountStrategy(DiscountStrategy discountStrategy) { this.discountStrategy = discountStrategy; } public double getFinalPrice(double originalPrice) { return discountStrategy.calculatePrice(originalPrice); } }
我们在客户端代码中使用上下文对象来调用具体的折扣策略:
public class Main { public static void main(String[] args) { PromotionContext context = new PromotionContext(); context.setDiscountStrategy(new NoDiscountStrategy()); // 不打折的情况 System.out.println("原价:" + context.getFinalPrice(100) + "元"); // 原价:100元 context.setDiscountStrategy(new TenPercentDiscountStrategy()); // 打九折的情况 System.out.println("原价:" + context.getFinalPrice(100) + "元"); // 原价:90元 } }
通过这个例子,我们可以看到策略模式的优势:当我们需要添加新的促销活动时,只需要实现一个新的折扣策略类,而不需要修改原有的代码,这大大提高了代码的可扩展性和可维护性。