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

策略模式在 Spring Boot 框架中的应用

策略模式在 Spring Boot 框架中的应用

策略模式 在 Spring Boot 中的应用十分广泛,特别是在处理需要根据条件选择不同实现时,常常会使用到策略模式。例如在依赖注入、业务逻辑处理、数据转换、支付系统、权限控制等场景中,我们都可以通过策略模式来提高代码的灵活性和可扩展性。

可以通过这篇文章详细了解策略模式的实现原理 点击阅读

Spring Boot 中,策略模式的实现通常借助 依赖注入 来动态选择具体的策略,这使得我们可以轻松地扩展新的策略类,而不需要修改现有的代码。

Spring Boot 中策略模式的应用场景:支付系统

场景描述

假设我们在一个电商系统中实现多种支付方式(如支付宝、微信支付、信用卡等)。每种支付方式的处理逻辑不同,我们希望能在用户选择支付方式时动态选择对应的支付策略。这里可以使用策略模式,将不同的支付逻辑封装在独立的策略类中,并在运行时根据用户的选择来决定使用哪个支付策略。

角色映射

  1. Strategy:支付策略接口,定义通用的支付方法。
  2. ConcreteStrategy:具体的支付策略实现类,如支付宝支付、微信支付等。
  3. Context:支付服务类,负责根据用户的选择动态调用不同的支付策略。

实现步骤:Spring Boot 支付系统中的策略模式

Step 1: 定义支付策略接口

PaymentStrategy 接口定义了一个通用的支付方法 pay(),不同支付方式将实现该接口。

// 策略接口:支付策略
public interface PaymentStrategy {void pay(double amount);
}

Step 2: 实现具体的支付策略类

每种支付方式都实现 PaymentStrategy 接口,定义各自的支付逻辑。

支付宝支付策略

import org.springframework.stereotype.Service;// 具体策略类:支付宝支付
@Service("alipay")
public class AlipayStrategy implements PaymentStrategy {@Overridepublic void pay(double amount) {System.out.println("Paying " + amount + " using Alipay.");}
}

微信支付策略

import org.springframework.stereotype.Service;// 具体策略类:微信支付
@Service("wechatPay")
public class WechatPayStrategy implements PaymentStrategy {@Overridepublic void pay(double amount) {System.out.println("Paying " + amount + " using WeChat Pay.");}
}

信用卡支付策略

import org.springframework.stereotype.Service;// 具体策略类:信用卡支付
@Service("creditCard")
public class CreditCardStrategy implements PaymentStrategy {@Overridepublic void pay(double amount) {System.out.println("Paying " + amount + " using Credit Card.");}
}

Step 3: 创建支付服务类(上下文)

PaymentService 类作为上下文类,负责根据用户的选择动态选择并执行支付策略。我们使用 Spring 的 @Autowired@Qualifier 注解,动态注入不同的支付策略。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;import java.util.Map;// 上下文类:支付服务
@Service
public class PaymentService {private final Map<String, PaymentStrategy> paymentStrategies;@Autowiredpublic PaymentService(Map<String, PaymentStrategy> paymentStrategies) {this.paymentStrategies = paymentStrategies;}public void executePayment(String paymentType, double amount) {PaymentStrategy strategy = paymentStrategies.get(paymentType);if (strategy != null) {strategy.pay(amount);} else {System.out.println("Invalid payment type: " + paymentType);}}
}

解释

  • Map:Spring 通过 @Autowired 注入一个包含所有支付策略的 Map,键是 Spring @Service 注解中的名称,值是对应的 PaymentStrategy 实例。
  • executePayment():根据用户选择的支付类型,动态选择对应的策略并调用支付方法。

Step 4: 测试策略模式

接下来我们创建一个 Spring Boot 控制器,用于处理支付请求。用户可以通过发送 HTTP 请求来指定支付方式和金额。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/payment")
public class PaymentController {private final PaymentService paymentService;@Autowiredpublic PaymentController(PaymentService paymentService) {this.paymentService = paymentService;}@PostMapping("/pay")public String makePayment(@RequestParam String paymentType, @RequestParam double amount) {// 调用支付服务,根据支付方式进行支付paymentService.executePayment(paymentType, amount);return "Payment processed with " + paymentType + " for amount: " + amount;}
}

使用 curl 测试支付接口

1. 支付宝支付
curl -X POST "http://localhost:8080/payment/pay?paymentType=alipay&amount=100.0"
2. 微信支付
curl -X POST "http://localhost:8080/payment/pay?paymentType=wechatPay&amount=150.0"
3. 信用卡支付
curl -X POST "http://localhost:8080/payment/pay?paymentType=creditCard&amount=200.0"

输出结果

Paying 100.0 using Alipay.
Payment processed with alipay for amount: 100.0Paying 150.0 using WeChat Pay.
Payment processed with wechatPay for amount: 150.0Paying 200.0 using Credit Card.
Payment processed with creditCard for amount: 200.0

Spring Boot 中策略模式的实现关键点

  1. 使用 @Service 注册策略类
    • 每个策略类都使用 @Service 注册为 Spring 的 Bean。通过设置不同的名称(如 "alipay""wechatPay"),可以在上下文中识别不同的策略。
  2. 通过 Map 动态注入策略
    • Spring 的 @Autowired 支持将所有实现了 PaymentStrategy 接口的 Bean 注入到一个 Map 中,键为 Bean 的名称,值为 Bean 实例。这允许我们根据用户选择动态获取对应的支付策略。
  3. 上下文类(PaymentService)负责调用策略
    • PaymentService 通过支付类型的名称动态获取并执行相应的支付策略,实现了策略的动态选择。

总结

Spring Boot 中,策略模式可以通过 依赖注入@Autowired 注解 轻松实现。通过将策略类注册为 Spring 的 Bean,可以灵活地选择和切换不同的策略。在支付系统中,策略模式允许我们根据用户选择的支付方式动态选择对应的支付逻辑,使系统具有更好的扩展性和灵活性。

策略模式在 Spring Boot 中的应用场景十分广泛,包括支付处理、日志策略、缓存策略等,任何需要根据不同条件选择不同算法或行为的场景,都可以应用策略模式来实现。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 实验3 Hadoop集群运行环境搭建和使用
  • 创建索引遇到这个Bug,19c中还没有修复
  • 粒子向上持续瀑布动画效果(直接粘贴到记事本改html即可)
  • 【AI实战攻略】保姆级教程:用AI打造治愈动画vlog,轻松打造爆款,快速涨粉!
  • maxcompute使用篇
  • 8. 防火墙
  • Nginx从入门到入土(二): 学习内容与安装
  • LeetCode 面试经典150题 190.颠倒二进制位
  • 微服务Docker相关指令
  • 第三章 Smart X超融合测试历程第三天
  • 边缘计算网关在工业中的应用
  • ⭐ Unity + OpenCV 实现实时图像识别与叠加效果
  • MySQL---创建数据库(基于SQLyog)
  • MySQL系列—11.Redo log
  • 深度学习速通系列:如何使用文本标注工具进行命名实体识别?
  • cookie和session
  • Docker容器管理
  • Effective Java 笔记(一)
  • Java 23种设计模式 之单例模式 7种实现方式
  • JavaScript 基础知识 - 入门篇(一)
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • opencv python Meanshift 和 Camshift
  • ReactNativeweexDeviceOne对比
  • Spring核心 Bean的高级装配
  • tab.js分享及浏览器兼容性问题汇总
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 面试遇到的一些题
  • 人脸识别最新开发经验demo
  • 如何实现 font-size 的响应式
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 一、python与pycharm的安装
  • 原生js练习题---第五课
  • 云大使推广中的常见热门问题
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • FaaS 的简单实践
  • linux 淘宝开源监控工具tsar
  • 数据可视化之下发图实践
  • 数据库巡检项
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • # Panda3d 碰撞检测系统介绍
  • ### RabbitMQ五种工作模式:
  • #laravel部署安装报错loadFactoriesFrom是undefined method #
  • #面试系列-腾讯后端一面
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (floyd+补集) poj 3275
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (十一)c52学习之旅-动态数码管
  • (四)React组件、useState、组件样式
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (轉)JSON.stringify 语法实例讲解