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

设计模式从入门到精通之(六)策略模式

策略模式:让算法灵活切换的秘密武器

在日常开发中,算法的选择常常是程序设计的核心,比如支付方式的选择、排序逻辑的切换、促销活动的动态调整等。当需求变化时,我们需要在多个算法之间切换,但又不希望修改已有代码。如何做到?

策略模式正是为这种场景设计的解决方案。


1. 什么是策略模式?

策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,并将每种算法封装起来,使它们可以互相替换,同时保证算法的独立性和灵活性。

用一句话概括:策略模式就是让不同的算法可以像插件一样自由切换,而无需修改调用者的代码。


2. 现实生活中的策略模式

想象一下,你在网上购物时选择支付方式。系统提供了多种支付方式:信用卡、支付宝、微信等。你只需选择其中一种,系统会根据你的选择完成支付。
请添加图片描述

在这个场景中:

  1. 支付方式是不同的算法。
  2. 系统作为调用者无需关心支付细节,只需根据你的选择调用对应的支付算法。

3. 策略模式的代码实现

以支付系统为例,展示策略模式的实现。

3.1 定义策略接口

首先,定义一个通用的支付策略接口。

interface PaymentStrategy {void pay(double amount);
}

3.2 实现具体的策略

创建具体的支付方式,比如信用卡支付和支付宝支付。

class CreditCardPayment implements PaymentStrategy {@Overridepublic void pay(double amount) {System.out.println("Paid $" + amount + " using Credit Card.");}
}class AlipayPayment implements PaymentStrategy {@Overridepublic void pay(double amount) {System.out.println("Paid $" + amount + " using Alipay.");}
}

3.3 创建上下文类

上下文类负责维护对策略对象的引用,并根据需要调用具体的策略。

class PaymentContext {private PaymentStrategy paymentStrategy;public void setPaymentStrategy(PaymentStrategy paymentStrategy) {this.paymentStrategy = paymentStrategy;}public void executePayment(double amount) {if (paymentStrategy == null) {System.out.println("No payment method selected!");} else {paymentStrategy.pay(amount);}}
}

3.4 客户端代码

在客户端中,动态切换支付方式。

public class Main {public static void main(String[] args) {PaymentContext context = new PaymentContext();// 使用信用卡支付context.setPaymentStrategy(new CreditCardPayment());context.executePayment(100);// 切换到支付宝支付context.setPaymentStrategy(new AlipayPayment());context.executePayment(200);}
}

运行结果:

Paid $100 using Credit Card.
Paid $200 using Alipay.

4. 策略模式的优缺点

优点:

  1. 算法独立:每种策略都有自己的类,便于维护和扩展。
  2. 遵循开闭原则:新增算法时无需修改已有代码。
  3. 灵活切换:可以根据运行时条件动态更换算法。

缺点:

  1. 增加类数量:每种策略都需要一个独立的类。
  2. 客户端需要了解策略:客户端需要知道有哪些策略,并显式地选择。

5. 策略模式的应用场景

  1. 支付系统:支持多种支付方式。
  2. 排序算法:动态选择不同的排序逻辑。
  3. 促销活动:根据用户类型或节日选择不同的促销策略。
  4. 游戏开发:角色技能或 AI 行为的动态切换。

6. 总结

策略模式通过将算法封装成独立的类,极大地提高了代码的灵活性和可扩展性。它非常适合那些需要动态切换算法的场景,但需要注意控制策略类的数量,避免代码过于臃肿。

下一篇专栏,我们将继续探讨另一种行为型模式:责任链模式,看它如何实现请求处理的链式分发。


思考问题:
在复杂系统中,如何优雅地管理众多策略类?欢迎留言讨论!

http://www.xdnf.cn/news/20152.html

相关文章:

  • 资源管理-dd命令
  • 《嵌入式硬件(三):串口通信》
  • Jenkins 监控方案:Prometheus + Grafana 实践
  • Java 学习笔记(进阶篇2)
  • 《Cocos Creator的2D、3D渲染使用记录》
  • 使用自定义固定公网URL地址远程访问公司内网OA办公系统,本地无需公网IP和专线让外网访问
  • 【Python基础】 19 Rust 与 Python if 语句对比笔记
  • Unity学习----【进阶】Addressables(二)--加载资源与打包及更新
  • Github | MoneyPrinterTurbo:自动化视频内容生成系统
  • 医疗AI中GPU集群设计与交付实践
  • Windows蓝屏解决方案(扩展)
  • C++进阶——继承 (1)
  • Dify on DMS,快速构建开箱即用的客服对话数据质检服务
  • Cursor Pair Programming:在前端项目里用 AI 快速迭代 UI 组件
  • STM32使用HAL库驱动铁电存储FM25CL64
  • 用 Shields.io 定制 README 个性徽章
  • 嵌入式铁头山羊stm32-SAR型ADC模块介绍、采样时间、转换时间-Day24
  • Web与Nginx
  • MCP 和 Fuction Call 有什么不同
  • Python基础(①④内存管理机制)
  • 【Element Plus 表单组件样式统一 CSS 文字特效实现指南】
  • 啥是两化融合?
  • 算法模板(Java版)_哈希表
  • 手写Java泛型,彻底掌握它!
  • 结合prompt分析NodeRAG的build过程
  • MySQL事务的四大特性(ACID)
  • 代码随想录二刷之“贪心算法”~GO
  • HTML 基本结构
  • 一篇文章带你彻底搞懂 JVM 垃圾收集器
  • 大数据开发计划表(实际版)