news 2026/4/2 16:50:53

【设计模式|第九篇】策略模式实战:优雅解耦业务逻辑

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【设计模式|第九篇】策略模式实战:优雅解耦业务逻辑
  • 策略模式详解
    • 什么是策略模式?
      • 核心机制
      • 现实类比
    • 策略模式的优势
    • 典型应用场景
      • 1. 电商促销系统
      • 2. 支付系统
    • 实际应用示例
      • 电商订单处理
      • 图像处理应用

策略模式详解

什么是策略模式?

策略模式是一种行为设计模式,其核心思想是:定义一系列算法,将每一个算法都封装起来,并使它们可以相互替换。策略模式让算法独立于使用它的客户端而变化。

核心机制

策略模式的实现包含以下关键组件:

  1. 策略接口(Strategy Interface):定义所有支持的算法或行为的公共接口
  2. 具体策略类(Concrete Strategies):实现策略接口的具体算法类
  3. 上下文类(Context):持有一个策略对象的引用,并通过策略接口与之交互

现实类比

以导航系统为例:

  • Context:我们的出行行为
  • Strategy Interface:导航算法接口
  • Concrete Strategies
    • FastestRouteStrategy:时间最短策略
    • ShortestRouteStrategy:距离最短策略
    • AvoidHighwayStrategy:避开高速策略
    • ScenicRouteStrategy:风景路线策略

策略模式的优势

  1. 完美遵循开闭原则

    • 新增策略时只需添加新类,无需修改现有代码
    • 例如电商系统新增"会员日双倍积分策略"时,只需创建DoublePointsStrategy
  2. 算法独立与解耦

    • 每个策略类封装特定算法,可独立测试和维护
    • 例如支付策略可单独测试微信支付、支付宝支付的业务逻辑
  3. 消除条件语句

    • 将复杂的条件分支转换为对象组合
    • 例如替代支付方式选择的switch-case结构:
      // 传统方式switch(paymentType){case"ALIPAY":processAlipay();break;case"WECHAT":processWechat();break;// ...}// 策略模式paymentStrategy.pay(amount);
  4. 运行时灵活性

    • 可在程序运行时动态切换策略
    • 例如根据网络状况切换图片加载策略(高质量/省流量)

典型应用场景

1. 电商促销系统

策略接口

publicinterfacePromotionStrategy{doublecalculatePrice(doubleoriginalPrice);}

具体策略实现

  1. 满减策略
publicclassCashRebateStrategyimplementsPromotionStrategy{privatedoublecondition;// 满减条件,如300privatedoublerebate;// 减免金额,如50@OverridepublicdoublecalculatePrice(doubleoriginalPrice){returnoriginalPrice>=condition?originalPrice-rebate:originalPrice;}}
  1. 折扣策略
publicclassDiscountStrategyimplementsPromotionStrategy{privatedoublediscountRate;// 折扣率,如0.9@OverridepublicdoublecalculatePrice(doubleoriginalPrice){returnoriginalPrice*discountRate;}}
  1. 无优惠策略
publicclassNoPromotionStrategyimplementsPromotionStrategy{@OverridepublicdoublecalculatePrice(doubleoriginalPrice){returnoriginalPrice;}}

上下文使用

publicclassPromotionContext{privatePromotionStrategystrategy;publicvoidsetStrategy(PromotionStrategystrategy){this.strategy=strategy;}publicdoubleexecuteStrategy(doubleoriginalPrice){returnstrategy.calculatePrice(originalPrice);}}

2. 支付系统

策略接口

publicinterfacePaymentStrategy{voidpay(doubleamount);}

具体支付实现

  1. 支付宝支付
publicclassAliPayStrategyimplementsPaymentStrategy{@Overridepublicvoidpay(doubleamount){// 调用支付宝SDKSystem.out.println("使用支付宝支付:"+amount+"元");}}
  1. 微信支付
publicclassWeChatPayStrategyimplementsPaymentStrategy{@Overridepublicvoidpay(doubleamount){// 调用微信支付APISystem.out.println("使用微信支付:"+amount+"元");}}
  1. 银行卡支付
publicclassCardPayStrategyimplementsPaymentStrategy{privateStringcardNumber;privateStringcvv;publicCardPayStrategy(StringcardNumber,Stringcvv){this.cardNumber=cardNumber;this.cvv=cvv;}@Overridepublicvoidpay(doubleamount){// 银行卡支付逻辑System.out.println("使用银行卡"+cardNumber.substring(cardNumber.length()-4)+"支付:"+amount+"元");}}

支付服务上下文

publicclassPaymentService{privatePaymentStrategypaymentStrategy;publicvoidsetPaymentStrategy(PaymentStrategystrategy){this.paymentStrategy=strategy;}publicvoidprocessPayment(doubleamount){paymentStrategy.pay(amount);}}

实际应用示例

电商订单处理

// 创建支付上下文PaymentServicepaymentService=newPaymentService();// 用户选择支付宝支付paymentService.setPaymentStrategy(newAliPayStrategy());paymentService.processPayment(100.00);// 促销活动切换PromotionContextpromotionContext=newPromotionContext();promotionContext.setStrategy(newCashRebateStrategy(300,50));doublefinalPrice=promotionContext.executeStrategy(350.00);// 返回300.00

图像处理应用

// 图像压缩策略interfaceCompressionStrategy{voidcompress(Imageimage);}classJPEGCompressionimplementsCompressionStrategy{privateintquality;publicJPEGCompression(intquality){this.quality=quality;}@Overridepublicvoidcompress(Imageimage){// JPEG压缩逻辑}}classPNGCompressionimplementsCompressionStrategy{@Overridepublicvoidcompress(Imageimage){// PNG无损压缩}}// 根据用户选择应用不同压缩策略CompressionStrategystrategy=userWantsLossless?newPNGCompression():newJPEGCompression(80);strategy.compress(userImage);
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/3 5:50:06

二叉树遍历(flist)(信息学奥赛一本通- P1364)全网最易理解版本

【题目描述】 树和二叉树基本上都有先序、中序、后序、按层遍历等遍历顺序,给定中序和其它一种遍历的序列就可以确定一棵二叉树的结构。 假定一棵二叉树一个结点用一个字符描述,现在给出中序和按层遍历的字符串,求该树的先序遍历字符串。 【输…

作者头像 李华
网站建设 2026/3/29 1:22:14

【教育科技前沿突破】:基于知识图谱的教育 Agent 实时内容更新方案详解

第一章:教育 Agent 内容更新的背景与意义随着人工智能技术的快速发展,教育领域正经历一场深刻的智能化变革。传统的教学模式受限于资源分配不均、个性化支持不足等问题,难以满足日益多样化的学习需求。教育 Agent 作为融合自然语言处理、知识…

作者头像 李华
网站建设 2026/3/31 9:59:49

SRC挖掘?这份保姆级教程已备好!

SRC挖掘?看这篇就够了,保姆级教程带你飞! 独家秘笈大纲 探宝寻踪 :锁定漏洞目标 深入虎穴 :漏洞挖掘实战 锦囊妙计 :报告撰写指南 吉星高照 :上榜最佳时机 积分飞跃 :快速上分技…

作者头像 李华
网站建设 2026/4/2 20:43:42

历年重庆大学计算机考研复试机试真题

2025年重庆大学计算机考研复试机试真题 2025年重庆大学计算机考研复试上机真题 历年重庆大学计算机考研复试上机真题 历年重庆大学计算机考研复试机试真题 更多学校题目开源地址:https://gitcode.com/verticallimit1/noobdream N 诺 DreamJudge 题库&#xff1…

作者头像 李华
网站建设 2026/4/3 3:17:25

21、正则表达式高级应用与 POSIX 标准解析

正则表达式高级应用与 POSIX 标准解析 1. 字符范围与 POSIX 字符类 在处理正则表达式时,字符范围是一个常用的工具。例如,使用 grep -h ^[A-Z] dirlist*.txt 可以匹配以大写字母开头的文件名。通过三字符范围,我们可以缩写 26 个字母,甚至可以使用多个范围来匹配以字母…

作者头像 李华
网站建设 2026/3/28 7:13:43

23、Linux文本处理与编辑工具全解析

Linux文本处理与编辑工具全解析 1. 文本去重与统计:uniq命令 在处理文本时,经常会遇到需要去除重复行的情况。 uniq 命令就可以实现这一功能,但它只能去除相邻的重复行。 uniq 有多个选项,常见选项如下表所示: | 选项 | 长选项 | 描述 | | — | — | — | | -c |…

作者头像 李华