- 策略模式详解
- 什么是策略模式?
- 核心机制
- 现实类比
- 策略模式的优势
- 典型应用场景
- 1. 电商促销系统
- 2. 支付系统
- 实际应用示例
- 电商订单处理
- 图像处理应用
策略模式详解
什么是策略模式?
策略模式是一种行为设计模式,其核心思想是:定义一系列算法,将每一个算法都封装起来,并使它们可以相互替换。策略模式让算法独立于使用它的客户端而变化。
核心机制
策略模式的实现包含以下关键组件:
- 策略接口(Strategy Interface):定义所有支持的算法或行为的公共接口
- 具体策略类(Concrete Strategies):实现策略接口的具体算法类
- 上下文类(Context):持有一个策略对象的引用,并通过策略接口与之交互
现实类比
以导航系统为例:
- Context:我们的出行行为
- Strategy Interface:导航算法接口
- Concrete Strategies:
FastestRouteStrategy:时间最短策略ShortestRouteStrategy:距离最短策略AvoidHighwayStrategy:避开高速策略ScenicRouteStrategy:风景路线策略
策略模式的优势
完美遵循开闭原则
- 新增策略时只需添加新类,无需修改现有代码
- 例如电商系统新增"会员日双倍积分策略"时,只需创建
DoublePointsStrategy类
算法独立与解耦
- 每个策略类封装特定算法,可独立测试和维护
- 例如支付策略可单独测试微信支付、支付宝支付的业务逻辑
消除条件语句
- 将复杂的条件分支转换为对象组合
- 例如替代支付方式选择的switch-case结构:
// 传统方式switch(paymentType){case"ALIPAY":processAlipay();break;case"WECHAT":processWechat();break;// ...}// 策略模式paymentStrategy.pay(amount);
运行时灵活性
- 可在程序运行时动态切换策略
- 例如根据网络状况切换图片加载策略(高质量/省流量)
典型应用场景
1. 电商促销系统
策略接口:
publicinterfacePromotionStrategy{doublecalculatePrice(doubleoriginalPrice);}具体策略实现:
- 满减策略:
publicclassCashRebateStrategyimplementsPromotionStrategy{privatedoublecondition;// 满减条件,如300privatedoublerebate;// 减免金额,如50@OverridepublicdoublecalculatePrice(doubleoriginalPrice){returnoriginalPrice>=condition?originalPrice-rebate:originalPrice;}}- 折扣策略:
publicclassDiscountStrategyimplementsPromotionStrategy{privatedoublediscountRate;// 折扣率,如0.9@OverridepublicdoublecalculatePrice(doubleoriginalPrice){returnoriginalPrice*discountRate;}}- 无优惠策略:
publicclassNoPromotionStrategyimplementsPromotionStrategy{@OverridepublicdoublecalculatePrice(doubleoriginalPrice){returnoriginalPrice;}}上下文使用:
publicclassPromotionContext{privatePromotionStrategystrategy;publicvoidsetStrategy(PromotionStrategystrategy){this.strategy=strategy;}publicdoubleexecuteStrategy(doubleoriginalPrice){returnstrategy.calculatePrice(originalPrice);}}2. 支付系统
策略接口:
publicinterfacePaymentStrategy{voidpay(doubleamount);}具体支付实现:
- 支付宝支付:
publicclassAliPayStrategyimplementsPaymentStrategy{@Overridepublicvoidpay(doubleamount){// 调用支付宝SDKSystem.out.println("使用支付宝支付:"+amount+"元");}}- 微信支付:
publicclassWeChatPayStrategyimplementsPaymentStrategy{@Overridepublicvoidpay(doubleamount){// 调用微信支付APISystem.out.println("使用微信支付:"+amount+"元");}}- 银行卡支付:
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);