在多支付渠道中这个设计模式无敌好用!

假设我们有一个电商平台,需要支持多种支付方式。

通过策略模式来实现,管理不同的支付方式,并根据需求快速添加新的支付方式。

  1. 定义支付策略接口及其实现类:

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

// 支付宝支付策略的实现类
public class AlipayStrategy implements PaymentStrategy {
@Override
public void pay(int amount) {
System.out.println("使用支付宝支付" + amount + "元");
// 模拟支付逻辑
}
}

// 微信支付策略的实现类
public class WechatPayStrategy implements PaymentStrategy {
@Override
public void pay(int amount) {
System.out.println("使用微信支付" + amount + "元");
// 模拟支付逻辑
}
}

// 银联支付策略的实现类
public class UnionPayStrategy implements PaymentStrategy {
@Override
public void pay(int amount) {
System.out.println("使用银联支付" + amount + "元");
// 模拟支付逻辑
}
}

  1. 支付上下文类:

public class PaymentContext {
private PaymentStrategy strategy;

public PaymentContext(PaymentStrategy strategy) {
this.strategy = strategy;
}

public void executePayment(int amount) {
strategy.pay(amount);
}
}

  1. 订单类:

public class Order {
private int orderId;
private int amount;
private String paymentType;

public Order(int orderId, int amount, String paymentType) {
this.orderId = orderId;
this.amount = amount;
this.paymentType = paymentType;
}

public int getOrderId() {
return orderId;
}

public int getAmount() {
return amount;
}

public String getPaymentType() {
return paymentType;
}
}

  1. 订单服务类:

@Service
public class OrderService {
private Map<String, PaymentStrategy> strategies = new HashMap<>();

@Autowired
private ApplicationContext context;

@PostConstruct
public void init() {
Map<String, PaymentStrategy> beans = context.getBeansOfType(PaymentStrategy.class);
strategies.putAll(beans);
}

public void processOrder(Order order) {
PaymentStrategy strategy = strategies.get(order.getPaymentType());
if (strategy != null) {
System.out.println("处理订单:" + order.getOrderId());
strategy.pay(order.getAmount());
} else {
throw new IllegalArgumentException("无效的支付类型:" + order.getPaymentType());
}
}
}

  1. Spring配置文件(application.yml):

yaml

payment:
strategies:
- name: alipayStrategy
className: com.example.strategy.AlipayStrategy
- name: wechatPayStrategy
className: com.example.strategy.WechatPayStrategy
- name: unionPayStrategy
className: com.example.strategy.UnionPayStrategy

  1. 测试类:

public class PaymentApplication {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
OrderService orderService = context.getBean(OrderService.class);

// 创建订单
Order order1 = new Order(1, 100, "alipayStrategy");
Order order2 = new Order(2, 200, "wechatPayStrategy");
Order order3 = new Order(3, 300, "unionPayStrategy");

// 处理订单
orderService.processOrder(order1); // 输出:使用支付宝支付100元
orderService.processOrder(order2); // 输出:使用微信支付200元
orderService.processOrder(order3); // 输出:使用银联支付300元
}
}

  1. AppConfig类:

@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
// 其他配置
}

PS:我们通过定义支付策略接口及其实现类、创建支付上下文类、订单类以及订单服务类,实现了对不同支付方式的灵活管理和调用。

Spring配置文件和测试类则展示了如何在Spring框架中集成和测试策略模式。

除了基本的支付逻辑,还展示了如何通过Spring框架自动加载和管理支付策略,进一步增强了灵活性和可扩展性。

我个人建议大家在日常开发中多多尝试使用策略模式,特别是在需要处理多种类似操作的场景下,这个设计模式是23种设计模式中除了单例、工厂以外为数不多的实用容易理解的模式了。

最后说一句(求关注!别白嫖!)

如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、转发、在看。

关注公众号:woniuxgg,在公众号中回复:笔记  就可以获得蜗牛为你精心准备的java实战语雀笔记,回复面试、开发手册、有超赞的粉丝福利!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/22387.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SASS基础知识

什么是SASS 1. SASS与CSS的关系 SASS&#xff08;Syntactically Awesome Stylesheets&#xff09;是一种强大的CSS扩展语言&#xff0c;它允许开发者使用变量、嵌套规则、混合宏和更多功能&#xff0c;这些在纯CSS中是不可能做到的。SASS旨在简化CSS代码的维护&#xff0c;并…

C语言练习1

前言 从0开始记录我的学习历程&#xff0c;我会尽我所能&#xff0c;写出最最大白话的文章&#xff0c;希望能够帮到你&#xff0c;谢谢。 提示&#xff1a;文章作者为初学者&#xff0c;有问题请评论指正&#xff0c;感谢。 题目 1&#xff1a; 已有定义&#xff1a;char a…

BI平台概述

随着数字化浪潮的推进&#xff0c;企业对于数据驱动决策的需求日益增长。纷享销客作为一款领先的CRM平台&#xff0c;一直致力于帮助企业实现销售管理的高效与智能。纷享销客一体化BI智能分析平台作为CRM平台中的重要一环&#xff0c;旨在为企业提供更加全面、深入的数据分析能…

【EBS】通过SQL查找所有的定时请求

--查找所有定时请求。 --也可以登录系统&#xff0c;在系统管理员下查找特定请求&#xff0c;状态设置为Scheduled进行查询 SELECT DISTINCT USER_CONCURRENT_PROGRAM_NAME, B.RESUBMIT_INTERVAL, B.RESUBMIT_INTERVAL_UNIT_CODE FROM FND_CONCURRENT_PROGRAMS_TL A, FND_…

HBuilderX编写APP一、获取token

一、新建项目 二、从onenet获取key.js 1、下载之后的压缩包&#xff0c;解压2、关键就是找到key.js 3、将这个key.js复制到刚才的目录下面去 4、这个key.js文件就是生成token的代码 5、只要调用createCommonToken(params)这个函数&#xff0c;就可以实现生成token了 其中onload…

Vue Router源码分析

摘要&#xff1a;最近项目中遇到了点Vue Router的问题&#xff0c;发现有些只是没理清楚&#xff0c;再次复习了下Vue Router的源码&#xff0c;记录下... Vue-Router的能力十分强大&#xff0c;它支持hash、history、abstract 3种路由方式&#xff0c;提供了<router-link&g…

Java多线程核心工具类

1.Thread类&#xff1a;代表一个线程。你可以通过继承Thread类或实现Runnable接口来创建线程。 2.Executor框架&#xff1a;java.util.concurrent.Executors和java.util.concurrent.Executor接口提供了一种创建和管理线程池的方法&#xff0c;可以减少在创建和销毁线程上的开销…

【TB作品】msp430g2553单片机,OLED,PCF8591,ADC,DAC

硬件 OLED PCF8591 /** OLED* VCC GND* SCL接P2^0* SDA接P2^1*//** PCF8591* VCC GND* SCL接P1^4* SDA接P1^5*//* 板子上按键 P1.3 *//* 单片机ADC输入引脚 P1.1 *//* 说明&#xff1a;将PCF8591的DAC输出接到单片机ADC输入引脚 P1.1&#xff0c;单片机采集电压并显示 */功能…

Docker run 命令常用参数详解

Docker run 命令提供了丰富的参数选项&#xff0c;用于配置容器的各种设置。以下是docker run命令的主要参数详解&#xff0c; 主要参数详解 后台运行与前台交互 -d, --detach: 在后台运行容器&#xff0c;并返回容器ID。-it: 分配一个伪终端&#xff08;pseudo-TTY&#xff0…

python字典用法

有dict和defaultdict两种字典。 defaultdict 是 Python 标准库中 collections 模块提供的一个类&#xff0c;它是 dict 的一个子类&#xff0c;具有与普通字典相同的接口和功能&#xff0c;但在某些方面表现出不同的行为。 与普通的字典相比&#xff0c;defaultdict 的一个主要…

RGB转LAB,HSV

Excel如下 目标 代码&#xff08;改下两个地址就可以&#xff09; import pandas as pd import colorspacious import colorsys# 读取Excel文件 df pd.read_excel(未分类output.xlsx)# 定义RGB到LAB和HSV的转换函数 def rgb_to_lab(rgb):lab colorspacious.cspace_convert(r…

Linux开发:tmpfs文件系统

通过df可以查看当前挂载的文件系统的使用情况: $ df文件系统 1K的块 已用 可用 已用% 挂载点 tmpfs 812364 3016 809348 1% /run /dev/sda3 526802392 16562608 483406276 4% / tmpfs 4061816 0 …

Layui:一款强大的前端UI框架

随着互联网技术的快速发展&#xff0c;前端技术也在不断更新和演进。前端工程师们面临着越来越多的挑战&#xff0c;需要在短时间内构建出高质量、高效率的网页应用。为了提高开发效率和降低开发难度&#xff0c;许多前端UI框架应运而生。在这些框架中&#xff0c;Layui凭借其优…

Git-lfs入门使用教程

在备份我的毕设到github私有库的时候&#xff0c;发现git对于单文件大于100MB的会限制上传&#xff0c;一番折腾一下发现了git-lfs [Git LFS&#xff08;Large File Storage,大文件存储&#xff09;是 Github 开发的一个Git 的扩展&#xff0c;用于实现 Git 对大文件的支持]。 …

揭秘Linux启动的层层面纱,一文看懂从黑屏到界面的精彩之旅

从按下开机键到Linux系统界面显示&#xff0c;这中间究竟经历了怎样的过程?本文将为您一一揭开Linux启动的神秘面纱&#xff0c;详细剖析每个环节的工作原理&#xff0c;让你从内核出生到系统服务启动&#xff0c;一路见证这个过程的壮阔与精彩。 一、概述 Linux系统的启动过…

【场景题】如何排查CPU偏高的问题

为了解决CPU偏高的问题&#xff0c;我们首先看一下每一个进程的CPU占用情况&#xff0c;使用命令Top 可以看见是进程id为2266的进程里面的java程序&#xff0c;占用了CPU90%使用情况 所以我们需要找到是哪一个代码导致的这样的情况&#xff0c;由于代码是线程执行的&#xff…

测绘GIS和遥感领域比较好的公众号有哪些

测绘GIS和遥感领域&#xff0c;微信公众号作为信息传播和知识分享的重要渠道&#xff0c;为从业者提供了一个快速获取行业动态、技术进展和职业发展机会的平台。分享一些在测绘GIS和遥感领域表现突出的公众号推荐&#xff1a; 1. 慧天地&#xff1a;慧天地是一个知名的测绘公众…

Webrtc源码编译之个人仓库

FGYP_GENERATORSGoogle官方文档参考&#xff1a;https://webrtc.github.io/webrtc-org/native-code/development/# 安装VS ​ VS 必须安装在C盘&#xff0c;负责后续需要修改很多文件 ​ 1、Desktop development with C ​ 2、MFC and ATL support ​ 3、Windows10SDK ​ 选…

Potsdam、Toronto、Vaihingen数据集

Potsdam、Toronto、Vaihingen数据集 前言原始数据集详情 Vaihingen是一个相对较小的村庄&#xff0c;有许多独立的建筑和小的多层建筑。 标签类别对照表 前言 原始数据集详情 Vaihingen是一个相对较小的村庄&#xff0c;有许多独立的建筑和小的多层建筑。 KeyValue卫星类型未…

【数据结构】穿梭在二叉树的时间隧道:顺序存储的实现

专栏引入 哈喽大家好&#xff0c;我是野生的编程萌新&#xff0c;首先感谢大家的观看。数据结构的学习者大多有这样的想法&#xff1a;数据结构很重要&#xff0c;一定要学好&#xff0c;但数据结构比较抽象&#xff0c;有些算法理解起来很困难&#xff0c;学的很累。我想让大家…