策略模式和工厂模式都是设计模式中的行为型设计模式,它们都有助于创建灵活、可扩展的代码。它们的应用场景和核心思想有明显的区别。策略模式关注的是算法的替换和变化,它强调的是行为的选择和执行;而工厂模式关注的是对象的创建,它强调的是实例化过程的控制和管理 。
策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,并将每个算法封装在一个具有共同接口的类中,使得它们可以相互替换,策略模式让算法独立于使用它的客户端。
策略模式的主要角色有以下几个:
1、抽象策略(Strategy):定义所有支持的算法的公共接口。
2、具体策略(ConcreteStrategy):实现抽象策略中的操作,即具体的算法实现。
3、上下文(Context):持有一个策略对象的引用,在调用其方法时,实际上调用的是策略对象的方法。
4、客户端(Client):使用上下文对象来调用具体策略的方法。
下面我们通过一个简单的例子来说明策略模式的使用。
假设我们要实现一个购物系统,系统中有多种商品,每种商品都有不同的折扣策略,我们可以使用策略模式来实现这个需求。
我们需要定义一个抽象策略,即折扣策略接口:
public interface DiscountStrategy { double getDiscount(double price); }
我们可以实现具体的折扣策略,例如满减策略、打折策略等:
public class FullReductionStrategy implements DiscountStrategy { @Override public double getDiscount(double price) { return price >= 100 ? price - 50 : price; } } public class DiscountStrategy implements DiscountStrategy { private double discount; public DiscountStrategy(double discount) { this.discount = discount; } @Override public double getDiscount(double price) { return price * discount; } }
我们需要定义一个上下文类,用于维护一个策略对象的引用:
public class ShoppingContext { private DiscountStrategy strategy; public void setStrategy(DiscountStrategy strategy) { this.strategy = strategy; } public double getPrice() { // 这里只是一个示例,实际情况下可能是从数据库或其他地方获取价格信息 return 200; } public double getDiscountedPrice() { return strategy.getDiscount(getPrice()); } }
我们可以在客户端代码中使用上下文对象来调用具体策略的方法:
public class Client { public static void main(String[] args) { ShoppingContext context = new ShoppingContext(); context.setStrategy(new FullReductionStrategy()); // 或者使用 context.setStrategy(new DiscountStrategy(0.8)); System.out.println("原价:" + context.getPrice()); System.out.println("折扣价:" + context.getDiscountedPrice()); } }
通过以上代码,我们可以看到策略模式的实现过程,当需要添加新的折扣策略时,只需要实现一个新的具体策略即可,而无需修改客户端代码,这样,我们的购物系统就实现了灵活的折扣策略管理。