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

java 策略模式 demo

策略模式介绍

策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,将每个算法封装起来并使它们可相互替换。策略模式让算法的变化独立于使用算法的客户端,从而实现灵活的算法切换。

核心角色:

  • • 环境类(Context):持有策略接口的引用,负责调用具体策略
  • • 策略接口(Strategy):定义所有支持的算法的公共接口
  • • 具体策略类(ConcreteStrategy):实现策略接口,提供具体算法实现

Java代码实现示例

下面通过一个"支付方式选择"的场景来演示策略模式:

// 策略接口:定义支付算法的公共接口
public interface PaymentStrategy {void pay(double amount);
}// 具体策略类:PayPal支付
public class PayPalPayment implements PaymentStrategy {private String emailId;private String password;public PayPalPayment(String emailId, String password) {this.emailId = emailId;this.password = password;}@Overridepublic void pay(double amount) {System.out.println(amount + " 元用PayPal支付。");// 实际应用中会有验证PayPal账号、连接PayPal接口等逻辑}
}// 具体策略类:信用卡支付
public class CreditCardPayment implements PaymentStrategy {private String name;private String cardNumber;private String cvv;private String expiryDate;public CreditCardPayment(String name, String cardNumber, String cvv, String expiryDate) {this.name = name;this.cardNumber = cardNumber;this.cvv = cvv;this.expiryDate = expiryDate;}@Overridepublic void pay(double amount) {System.out.println(amount + " 元用信用卡支付。");// 实际应用中会有验证信用卡信息、连接支付网关等逻辑}
}// 环境类:购物车,使用支付策略
public class ShoppingCart {private PaymentStrategy paymentStrategy;// 设置支付策略public void setPaymentStrategy(PaymentStrategy paymentStrategy) {this.paymentStrategy = paymentStrategy;}// 结算public void checkout(double amount) {if (paymentStrategy == null) {throw new IllegalStateException("请先设置支付方式");}paymentStrategy.pay(amount);}
}// 客户端代码
public class Main {public static void main(String[] args) {ShoppingCart cart = new ShoppingCart();// 选择信用卡支付PaymentStrategy creditCardPayment = new CreditCardPayment("张三", "1234-5678-9012-3456", "123", "12/25");cart.setPaymentStrategy(creditCardPayment);cart.checkout(100.50);// 切换为PayPal支付PaymentStrategy paypalPayment = new PayPalPayment("zhangsan@example.com", "password123");cart.setPaymentStrategy(paypalPayment);cart.checkout(200.75);}
}

代码解释

  1. 1. 策略接口(PaymentStrategy)
    • • 定义了所有支付方式的统一接口pay(double amount)
    • • 确保所有支付方式都遵循相同的调用规范
  2. 2. 具体策略类
    • • CreditCardPayment:实现信用卡支付的具体逻辑
    • • PayPalPayment:实现PayPal支付的具体逻辑
    • • 每个策略类都封装了自己的算法实现,相互独立
  3. 3. 环境类(ShoppingCart)
    • • 持有支付策略的引用,通过setPaymentStrategy方法设置具体策略
    • • 提供checkout方法,内部调用当前策略的pay方法完成支付
    • • 客户端无需知道具体支付细节,只需与购物车交互
  4. 4. 客户端(Main)
    • • 创建具体的支付策略对象
    • • 通过购物车设置支付策略并完成结算
    • • 可以随时切换不同的支付策略,无需修改购物车代码

策略模式的优势

  • • 灵活性高:可以在运行时动态切换算法
  • • 代码复用:避免使用多重条件判断(if-else或switch)
  • • 开闭原则:新增策略只需实现接口,无需修改现有代码
  • • 责任单一:每个策略类专注于实现一种算法

适用场景:当一个系统需要多种算法,且需要动态选择使用哪种算法时,适合使用策略模式。
更多参考资料

https://pan.baidu.com/s/1c1oQItiA7nZxz8Rnl3STpw?pwd=yftc
https://pan.quark.cn/s/dec9e4868381

http://www.lryc.cn/news/621472.html

相关文章:

  • 基于微信小程序的家教服务平台的设计与实现/基于asp.net/c#的家教服务平台/基于asp.net/c#的家教管理系统
  • 「iOS」————APP启动优化
  • 什么是接口?PHP如何使用 SessionHandlerInterface 接口实现Session自定义会话数据存储
  • Spark 运行流程核心组件(二)任务调度
  • Python 基础语法笔记.2
  • Dijkstra与Floyd求最短路算法简介
  • zabbix部署问题后常见问题
  • sqli-labs通关笔记-第50关 GET数值型order by堆叠注入(手工注入+脚本注入两种方法)
  • StringBoot-SSE和WebFlux方式消息实时推送-默认单向-可增加交互接口
  • qt项目中解决关闭弹窗后执行主界面的信号槽时闪退问题
  • c++中的Lambda表达式详解
  • ATAM:基于场景的软件架构权衡分析法
  • 使用Docker和Miniconda3搭建YOLOv13开发环境
  • 微服务架构概述
  • docker 容器管理入门教程
  • Docker network网络管理入门教程
  • JS 解构赋值语法
  • Vue浅学
  • 0814 TCP通信协议
  • 【C#补全计划】泛型约束
  • [TryHackMe](知识学习)---基于堆栈得到缓冲区溢出
  • Vue 3 + TypeScript:package.json 示例 / 详细注释说明
  • Apache 虚拟主机配置冲突导致 404 错误的排查总结
  • 通信算法之313:FPGA中实现滑动相关消耗DSP资源及7045/7035的乘法器资源
  • redis中分布式锁的应用
  • 面试题:如何用Flink实时计算QPS
  • 解锁AI潜能:五步写出让大模型神级指令
  • 宋红康 JVM 笔记 Day01|JVM介绍
  • 嵌入式开发学习———Linux环境下网络编程学习(一)
  • 【数据分享】351个地级市农业相关数据(2013-2022)-有缺失值