首页 > 其他分享 >springboot策略设计模式最佳实践

springboot策略设计模式最佳实践

时间:2024-11-07 22:19:32浏览次数:1  
标签:springboot 方式 配置 最佳 paymentStrategies 支付 import 设计模式 public

假设我们希望实现以下需求:

  1. 支付方式(如支付宝、微信支付)可以动态切换。
  2. 支付方式配置从配置文件中加载,或者支持在数据库中动态更新。
  3. 配置文件或数据库中指定当前生效的支付方式。

步骤 1: 配置文件定义支付方式

我们可以在 application.ymlapplication.properties 中定义支付方式配置项,指定默认的支付方式。

# application.yml
payment:
  defaultMethod: alipay

这里我们定义了一个 payment.defaultMethod 配置项,它用于指定当前选择的支付方式。假设我们有多个支付方式,默认支付方式是 alipay

步骤 2: 在 PaymentContext 中加载动态配置

为了根据配置动态选择支付方式,我们需要将配置文件中的 defaultMethod 读入,并根据它来确定使用哪个支付策略。可以通过 Spring 的 @Value 注解来注入配置项。

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.Map;

@Service
public class PaymentContext {

    private final Map<String, PaymentStrategy> paymentStrategies;
    
    @Value("${payment.defaultMethod}")
    private String defaultPaymentMethod;

    public PaymentContext(Map<String, PaymentStrategy> paymentStrategies) {
        this.paymentStrategies = paymentStrategies;
    }

    public void executePayment(double amount) {
        // 根据配置的支付方式动态选择策略
        PaymentStrategy strategy = paymentStrategies.get(defaultPaymentMethod);
        if (strategy != null) {
            strategy.pay(amount);
        } else {
            throw new IllegalArgumentException("Invalid payment method: " + defaultPaymentMethod);
        }
    }
}

在这个 PaymentContext 中,我们通过 @Value 注解将 application.yml 中的 payment.defaultMethod 配置项注入到 defaultPaymentMethod 变量中。然后在 executePayment 方法中,根据配置项选择对应的支付策略执行支付。

步骤 3: 动态更新支付方式(可选)

如果您希望在运行时动态切换支付方式,可以考虑将支付方式配置存储在数据库中。通过查询数据库中的配置项,可以灵活地更新支付方式。

假设我们有一个 PaymentConfig 表,包含 method_codeenabled 等字段来表示当前生效的支付方式。

@Entity
public class PaymentConfig {
    @Id
    private Long id;
    private String methodCode;
    private Boolean enabled;

    // getters and setters
}

接着,可以通过 Spring Data JPA 访问数据库中的配置:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class DynamicPaymentConfigService {

    private final PaymentConfigRepository paymentConfigRepository;

    @Autowired
    public DynamicPaymentConfigService(PaymentConfigRepository paymentConfigRepository) {
        this.paymentConfigRepository = paymentConfigRepository;
    }

    public String getActivePaymentMethod() {
        List<PaymentConfig> activeConfigs = paymentConfigRepository.findByEnabled(true);
        // 假设返回第一个启用的支付方式
        if (!activeConfigs.isEmpty()) {
            return activeConfigs.get(0).getMethodCode();
        }
        return null; // 如果没有配置,返回空
    }
}

然后在 PaymentContext 中使用这个动态配置服务来更新支付方式:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Map;

@Service
public class PaymentContext {

    private final Map<String, PaymentStrategy> paymentStrategies;
    private final DynamicPaymentConfigService dynamicPaymentConfigService;

    @Autowired
    public PaymentContext(Map<String, PaymentStrategy> paymentStrategies, DynamicPaymentConfigService dynamicPaymentConfigService) {
        this.paymentStrategies = paymentStrategies;
        this.dynamicPaymentConfigService = dynamicPaymentConfigService;
    }

    public void executePayment(double amount) {
        // 从数据库或配置中获取当前启用的支付方式
        String activePaymentMethod = dynamicPaymentConfigService.getActivePaymentMethod();
        if (activePaymentMethod != null) {
            PaymentStrategy strategy = paymentStrategies.get(activePaymentMethod);
            if (strategy != null) {
                strategy.pay(amount);
            } else {
                throw new IllegalArgumentException("Invalid payment method: " + activePaymentMethod);
            }
        } else {
            throw new IllegalStateException("No active payment method configured.");
        }
    }
}

通过上述方式,我们可以从数据库动态获取当前启用的支付方式,并在执行支付时应用它。

步骤 4: 控制器调用(不暴露支付方式)

在控制器层面,我们依然只关心执行支付,而不会暴露具体的支付方式。支付方式的选择完全依赖于配置文件或数据库中的设置。

import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/payment")
public class PaymentController {

    private final PaymentContext paymentContext;

    @Autowired
    public PaymentController(PaymentContext paymentContext) {
        this.paymentContext = paymentContext;
    }

    @PostMapping("/pay")
    public String pay(@RequestParam double amount) {
        try {
            paymentContext.executePayment(amount);
            return "支付成功!";
        } catch (IllegalArgumentException | IllegalStateException e) {
            return e.getMessage();
        }
    }
}

总结

  • 动态配置:通过 application.yml 或数据库存储支付方式配置,能够动态切换支付方式而不暴露给前端请求 URL。
  • 灵活扩展:新增支付方式时,只需要实现一个新的支付策略类,并在配置文件或数据库中添加相应的配置,无需修改控制器或核心业务逻辑。
  • 安全性:通过不暴露支付方式具体实现,只提供支付功能接口,增加了安全性和封装性。

这种设计不仅能够支持多种支付方式,还能够根据配置灵活切换支付策略,适应不同的支付场景。

标签:springboot,方式,配置,最佳,paymentStrategies,支付,import,设计模式,public
From: https://www.cnblogs.com/tyxy/p/18534129

相关文章

  • CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro
    说明此文章为转发的,方便日后查看。系统演示环境http://www.cc-admin.top/#/home简介CC-ADMIN前端简介现在市面的上后台管理系统很多,不差你这一个,为啥又来个轮子?答:材料不一样。本轮子的选材是在考察过antv、element之后选择了quasar,前两个很优秀,尤其是antv的外观我特......
  • 基于Java+SpringBoot心理测评心理测试系统功能实现五
    一、前言介绍:1.1项目摘要心理测评和心理测试系统在当代社会中扮演着越来越重要的角色。随着心理健康问题日益受到重视,心理测评和心理测试系统作为评估个体心理状态、诊断心理问题、制定心理治疗方案的工具,其需求和应用范围不断扩大。首先,现代社会节奏快速,竞争激烈,人们面临着来......
  • 基于Java+SpringBoot心理测评心理测试系统功能实现六
    一、前言介绍:1.1项目摘要心理测评和心理测试系统在当代社会中扮演着越来越重要的角色。随着心理健康问题日益受到重视,心理测评和心理测试系统作为评估个体心理状态、诊断心理问题、制定心理治疗方案的工具,其需求和应用范围不断扩大。首先,现代社会节奏快速,竞争激烈,人们面临着来......
  • SpringBoot校园二手书籍信息平台w5mzh--(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、研究目的与意义随着高校教育的普及,书籍成为大学生日常学习不可或缺的资源。然而,书籍的高消耗量和频繁更新导致了资源的浪费。因此,构建一个校园......
  • spring mvc,spring和springboot的关系
    SpringMVC、Spring和SpringBoot是Spring生态系统中的重要组成部分,它们各自有不同的职责和用途,但也紧密相关。以下是对它们关系的详细解释:1.Spring框架Spring框架是一个全面的企业级应用开发框架,提供了一种轻量级的解决方案,用于构建Java应用程序。Spring框架......
  • 毕业设计-springboot班级回忆录系统源码+论文
    项目简介海滨学院班级回忆录系统是一个综合性的在线平台,旨在为校友提供一个回忆和分享大学时光的空间。系统主要服务于管理员、班委和普通用户,提供了以下核心功能:管理员功能:    个人中心:管理员的个性化操作界面。    用户信息管理:管理员可以查看和管理用户信......
  • [免费]SpringBoot+Vue(高校)学籍管理系统【论文+源码+SQL脚本】
    大家好,我是java1234_小锋老师,看到一个不错的SpringBoot+Vue(高校)学籍管理系统,分享下哈。项目视频演示【免费】SpringBoot+Vue(高校)学籍管理系统Java毕业设计_哔哩哔哩_bilibili项目介绍对在线学籍管理的流程进行科学整理、归纳和功能的精简,通过软件工程的研究方法,结合当......
  • 【拯救大学生毕业设计】基于springboot的月度员工绩效考核管理系统
    本项目开发文档(带文档lw万字以上)已上传审核中。源码亲测可用!!!点击文末名片获取获取全部源码以及个性化部署定制服务摘 要科学时代的发展改变了人类的生活,促使网络与计算机技术深入人类的各个角落,得以普及到人类的具体生活中,为人类的时代文明掀开新的篇章。本系统为月......
  • React-Router-Dom6 最佳实践
    React-Router-Dom6最佳实践一咻世界都变了​关注 6人赞同了该文章​展开目录 react-router-dom6使用之前只使用过一次react-router,目前官方从5开始就已经放弃了原有的react-router库,统一命名为 react-router-dom了实现......
  • Springboot 配置yml文件 ENC 加密及failed to bind properties under '********' to j
    1.添加依赖<dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.3</version></dependency>2.设置加密盐......