当前位置: 首页 > news >正文

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

  • 策略模式详解
    • 什么是策略模式?
      • 核心机制
      • 现实类比
    • 策略模式的优势
    • 典型应用场景
      • 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);
http://www.cnnetsun.cn/news/140924.html

相关文章:

  • 软件测试成本的多维解析与优化路径
  • 5-脱氧-L-阿拉伯糖—结构独特的稀有单糖,药物设计与合成化学的宝贵砌块 CAS:13039-56-0
  • 2-乙酰胺基-1,3,4,6-四-O-乙酰基-2-脱氧-5-硫代-α-D-吡喃葡萄糖 —— 糖化学与药物研发的关键砌块 CAS:67561-97-1
  • 群体分析如何改变你的客户洞察
  • 别再为BGM被下架了,可以生成带声音且无版权素材的AI,真的来了
  • vue和springboot框架开发的校园商店零售管理系统_pt87nuk3
  • vue和springboot框架开发的校园智能AI问答技术的快递物流管理系统_5kf8to85
  • 文件句柄数超限
  • 如何用 Oracle 的账号和权限来连接 ZooKeeper 的客户端认证、ACL 绑定到身份 2 个概念
  • 艾宝体案例 | 以人为本、灵活赋能:Spectris携手KnowBe4打造高效安全意识与合规培训体系
  • 面向2025:融合AI安全的网络安全学习路线与技能清单
  • 迎战2026:网络安全从业者必须掌握的核心技能与实战路线图
  • python-uniapp微信小程序的字典词韵查询系统的设计与实现_79zfkl8b
  • 7个免费网站帮你降低论文AI率,通过万方AIGC查重,亲测有效
  • 【Java毕设全套源码+文档】基于springboot的拍卖管理系统设计与实现(丰富项目+远程调试+讲解+定制)
  • 基于开源AI智能名片链动2+1模式多商户商城小程序的销售工作性质与能力要求研究
  • 科研人都懂的绘图痛:你是否还在为这些问题熬夜?
  • 传统vs智能:编辑分配效率对比实验报告
  • Watt Toolkit实战:构建电商价格监控系统
  • 技术演进中的开发沉思-258 Ajax:自定义事件
  • 幽冥大陆(五十三)人工智能开发语言选型指南——东方仙盟筑基期
  • 小程序python-uniapp巴山大峡谷景区酒店预定系统的设计与实现_98434fj3
  • 【Java毕设源码分享】基于springboot+vue的易家宜超市云购物系统设计与实现(程序+文档+代码讲解+一条龙定制)
  • 用AI一键识别网站技术栈:Wappalyzer的智能分析
  • 【Java毕设源码分享】基于springboot+vue的苹果批发销售管理平台设计与实现(程序+文档+代码讲解+一条龙定制)
  • 【Java毕设源码分享】基于springboot+vue的街道办管理系统设计与实现(程序+文档+代码讲解+一条龙定制)
  • 代码随想录算法训练营第三十八天:最长公共子序列,不相交的线,最大子序和,判断子序列
  • 电脑与手机互传工具--强大的Coolmuster Android Assistant
  • Nacos注册/配置中心
  • Vue-cli如何集成WebUploader完成百万文件分块上传?