策略模式和工厂模式都是设计模式中的重要组成部分。工厂模式是一种创建对象的方式,使得创建对象的过程与使用对象的过程分离。而策略模式则是一种行为型设计模式,可以在运行时动态切换不同的算法或策略 。,,两者的区别在于,工厂模式关注对象创建,而策略模式关注算法多样性。工厂模式通常用于创建复杂对象,例如汽车、电脑等,而策略模式则用于解决同一问题的不同解决方案 。
策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,并将每个算法封装在一个具有共同接口的独立的类中,使得它们可以相互替换,策略模式让算法的变化独立于使用它的客户端。
在软件开发过程中,我们经常会遇到需要根据不同条件执行不同操作的情况,一个电商系统可能需要根据用户的购买金额来计算折扣;一个音乐播放器可能需要根据用户的喜好来推荐歌曲,这些场景都可以通过策略模式来实现。
策略模式的主要角色有以下几个:
1、抽象策略(Strategy):定义所有支持的算法的公共接口。
2、具体策略(ConcreteStrategy):实现抽象策略中的每一个具体方法。
3、上下文(Context):持有一个策略的引用,提供给客户端使用。
下面我们通过一个简单的例子来说明策略模式的用法,假设我们有一个购物系统,用户可以选择不同的支付方式进行结算,我们可以使用策略模式来实现这个功能。
我们需要定义一个支付策略接口:
public interface PaymentStrategy { void pay(double amount); }
我们可以为每种支付方式实现具体的策略:
public class AlipayStrategy implements PaymentStrategy { @Override public void pay(double amount) { System.out.println("使用支付宝支付:" + amount + "元"); } } public class WechatPayStrategy implements PaymentStrategy { @Override public void pay(double amount) { System.out.println("使用微信支付:" + amount + "元"); } }
我们需要定义一个上下文类,用于保存当前使用的支付策略:
public class ShoppingContext { private PaymentStrategy strategy; public ShoppingContext(PaymentStrategy strategy) { this.strategy = strategy; } public void setStrategy(PaymentStrategy strategy) { this.strategy = strategy; } public void executeStrategy(double amount) { strategy.pay(amount); } }
在客户端代码中,我们可以根据需要选择不同的支付策略:
public class Client { public static void main(String[] args) { ShoppingContext context = new ShoppingContext(new AlipayStrategy()); // 默认使用支付宝支付 context.executeStrategy(100); // 输出:使用支付宝支付:100.0元 ; context.setStrategy(new WechatPayStrategy()); // 切换到微信支付 context.executeStrategy(100); // 输出:使用微信支付:100.0元 } }
通过策略模式,我们可以轻松地实现不同支付方式之间的切换,而无需修改客户端代码,当需要添加新的支付方式时,只需实现一个新的策略类即可,无需修改现有代码,这使得策略模式成为设计模式中的优秀选择。