找回密码
 立即注册
首页 业界区 业界 掌握设计模式--策略模式

掌握设计模式--策略模式

乳杂丫 2025-6-6 14:39:42
策略模式(Strategy Pattern)

策略模式是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,从而让算法的变化独立于使用它们的客户端代码。
策略模式的核心在于为算法的实现提供统一的接口,并通过动态选择具体实现来实现灵活性。
组成部分


  • Context(上下文类):
    持有对某个策略对象的引用,并定义客户端需要的接口,负责在运行时动态切换策略。
  • Strategy(策略接口):
    定义所有支持的算法的公共接口。
  • ConcreteStrategy(具体策略实现):
    实现 Strategy 接口的具体算法。
代码示例

以下是使用策略模式实现不同的支付方式的动态切换。信用卡支付和微信支付的动态切换。
类图

1.png

策略接口
  1. // 策略接口
  2. public interface PaymentStrategy {
  3.     void pay(int amount);
  4. }
复制代码
具体策略实现
  1. // 具体策略实现 - 信用卡支付
  2. public class CreditCardPayment implements PaymentStrategy {
  3.     private String cardNumber;
  4.     public CreditCardPayment(String cardNumber) {
  5.         this.cardNumber = cardNumber;
  6.     }
  7.     @Override
  8.     public void pay(int amount) {
  9.         System.out.println("交易金额 " + amount + " 使用的卡号: " + cardNumber);
  10.     }
  11. }
  12. // 具体策略实现 - 微信支付
  13. public class WxPayment implements PaymentStrategy {
  14.     private String phoneNumber;
  15.     public WxPayment(String phoneNumber) {
  16.         this.phoneNumber = phoneNumber;
  17.     }
  18.     @Override
  19.     public void pay(int amount) {
  20.         System.out.println("交易金额 " + amount + " 使用的手机号: " + phoneNumber);
  21.     }
  22. }
复制代码
上下文
  1. // 上下文类
  2. public class PaymentContext {
  3.     private PaymentStrategy strategy;
  4.     public PaymentContext(PaymentStrategy strategy) {
  5.         this.strategy = strategy;
  6.     }
  7.     public void setStrategy(PaymentStrategy strategy) {
  8.         this.strategy = strategy;
  9.     }
  10.     public void executePayment(int amount) {
  11.         strategy.pay(amount);
  12.     }
  13. }
复制代码
测试代码
  1. public class StrategyPatternDemo {
  2.     public static void main(String[] args) {
  3.         // 使用信用卡支付
  4.         PaymentContext context = new PaymentContext(new CreditCardPayment("1234-5678-9012-3456"));
  5.         context.executePayment(100);
  6.         // 切换到Wx支付
  7.         context.setStrategy(new WxPayment("13112345678"));
  8.         context.executePayment(200);
  9.     }
  10. }
复制代码
测试结果

交易金额 100 使用的卡号: 1234-5678-9012-3456
交易金额 200 使用的手机号: 13112345678
优缺点和适用场景

优点


  • 开放-封闭原则: 新的策略可以在不修改现有代码的情况下添加。
  • 提高代码灵活性: 可以动态地在运行时选择算法。
  • 消除冗长的条件分支: 使用策略模式代替 if-else 或 switch-case 条件判断。
缺点


  • 类的数量增加: 每个策略需要定义一个类,可能导致类数量增多。
  • 客户端需要知道所有策略: 客户端必须了解策略的作用并选择合适的策略。
适用场景


  • 多个算法只有在行为上稍有不同的情况下。
  • 需要动态选择算法或者行为的情况下。
  • 避免使用条件语句(if-else 或 switch-case)来管理算法时。
实际应用


  • 数据加密算法选择(AES、RSA等)
  • 数据压缩算法(ZIP、GZIP)
  • 不同类型的文件解析(JSON、XML、YAML)
策略模式与其他模式的对比


  • 状态模式: 状态模式的行为是状态驱动的,而策略模式的行为是由客户端选择驱动的。
  • 工厂模式: 工厂模式用于创建对象,而策略模式关注的是行为的动态切换。
  • 桥接模式: 桥接模式侧重于分离抽象和实现及多维度的扩展;而策略模式用于封装算法或行为,单维度的扩展。
  • 装饰模式: 使用一系列装饰器类,通过组合的方式增强对象的功能。装饰器的核心在于“增强”。
  • 策略模式: 客户端在运行时选择合适的策略来完成特定任务。策略模式的核心在于“替换”。
总结

策略设计模式定义了一系列算法(策略),将每个算法封装到独立的策略类中,并通过上下文类动态地选择和使用不同的策略,从而让算法的变化独立于使用算法的客户端。
2.gif

需要查看往期设计模式文章的,可以在个人主页中或者文章开头的集合中查看,可关注我,持续更新中。。。
超实用的SpringAOP实战之日志记录
2023年下半年软考考试重磅消息
通过软考后却领取不到实体证书?
计算机算法设计与分析(第5版)
Java全栈学习路线、学习资源和面试题一条龙
软考证书=职称证书?
软考中级--软件设计师毫无保留的备考分享

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册