抽象工厂模式与策略模式结合使用小案例

目录

    • 1.前言
    • 1.示例说明
      • 1.1定义通用接口
      • 1.2 定义抽象工厂
      • 1.3 支付宝实现
      • 1.4 微信实现
      • 1.5 客户端使用代码(组合使用)
      • 1.6 示例结果输出
      • 1.7 总结

1.前言

       上一篇章就通过简单的案例来了解抽象工厂模式和策略模式的使用,现在就用个支付场景的小案例来演示两者设计模式的联合使用;

1.示例说明

       一个支付系统支持微信,支付宝,银联,数字人民币等多渠道的支付,但是每个支付渠道,在大致的流程上都相差无异,比如支付的处理,参数,秘钥等校验,日志的跟踪;

1.1定义通用接口

// 支付处理器
public interface PaymentProcessor {void processPayment(double amount);
}// 风控策略接口(策略模式)
public interface RiskControl {void checkRisk();
}// 日志记录器
public interface Logger {void log(String message);
}

1.2 定义抽象工厂

public interface PaymentFactory {PaymentProcessor createProcessor();RiskControl createRiskControl(); // 策略模式接口Logger createLogger();
}

1.3 支付宝实现

// 支付宝支付处理器
public class AlipayProcessor implements PaymentProcessor {public void processPayment(double amount) {System.out.println("使用支付宝处理支付:" + amount + " 元");}
}// 支付宝风控策略
public class AlipayRiskControl implements RiskControl {public void checkRisk() {System.out.println("支付宝风控检查通过");}
}// 支付宝日志
public class AlipayLogger implements Logger {public void log(String message) {System.out.println("支付宝日志:" + message);}
}// 支付宝工厂(组合策略)
public class AlipayPaymentFactory implements PaymentFactory {public PaymentProcessor createProcessor() {return new AlipayProcessor();}public RiskControl createRiskControl() {return new AlipayRiskControl();}public Logger createLogger() {return new AlipayLogger();}
}

1.4 微信实现

public class WeChatProcessor implements PaymentProcessor {public void processPayment(double amount) {System.out.println("使用微信处理支付:" + amount + " 元");}
}public class WeChatRiskControl implements RiskControl {public void checkRisk() {System.out.println("微信风控检查通过");}
}public class WeChatLogger implements Logger {public void log(String message) {System.out.println("微信日志:" + message);}
}public class WeChatPaymentFactory implements PaymentFactory {public PaymentProcessor createProcessor() {return new WeChatProcessor();}public RiskControl createRiskControl() {return new WeChatRiskControl();}public Logger createLogger() {return new WeChatLogger();}
}

1.5 客户端使用代码(组合使用)

public class PaymentService {private final PaymentProcessor processor;private final RiskControl riskControl; // 策略注入private final Logger logger;public PaymentService(PaymentFactory factory) {this.processor = factory.createProcessor();this.riskControl = factory.createRiskControl(); // 策略模式this.logger = factory.createLogger();}public void pay(double amount) {logger.log("开始支付流程");riskControl.checkRisk(); // 策略模式核心调用processor.processPayment(amount);logger.log("支付完成");}public static void main(String[] args) {// 使用支付宝PaymentFactory alipayFactory = new AlipayPaymentFactory();PaymentService alipayService = new PaymentService(alipayFactory);alipayService.pay(100.0);System.out.println("---------");// 使用微信PaymentFactory weChatFactory = new WeChatPaymentFactory();PaymentService weChatService = new PaymentService(weChatFactory);weChatService.pay(200.0);}
}

1.6 示例结果输出

支付宝日志:开始支付流程
支付宝风控检查通过
使用支付宝处理支付:100.0 元
支付宝日志:支付完成
---------
微信日志:开始支付流程
微信风控检查通过
使用微信处理支付:200.0 元
微信日志:支付完成

1.7 总结

特点描述
抽象工厂统一创建每种支付渠道的组件(处理器、日志器、风控)
策略模式将风控逻辑抽象出来,可替换、可扩展
组合使用每种渠道内部组合策略,不影响外部调用逻辑
易扩展新增一个支付渠道,只需新增实现类和一个工厂

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

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

相关文章

通过WiFi无线连接小米手机摄像头到电脑的方法

通过WiFi无线连接小米手机摄像头到电脑的方法 以下是基于Scrcpy和DroidCam两种工具的无线连接方案,需提前完成开发者模式与USB调试的开启(参考原教程步骤): 方法一:Scrcpy无线投屏(无需手机端安装&#xf…

2025软件供应链安全最佳实践︱证券DevSecOps下供应链与开源治理实践

项目背景:近年来,云计算、AI人工智能、大数据等信息技术的不断发展、各行各业的信息电子化的步伐不断加快、信息化的水平不断提高,网络安全的风险不断累积,金融证券行业面临着越来越多的威胁挑战。特别是近年以来,开源…

Java高级 | 【实验二】Springboot 控制器类+相关注解知识

隶属文章: Java高级 | (二十二)Java常用类库-CSDN博客 系列文章: Java高级 | 【实验一】Spring Boot安装及测试 最新-CSDN博客 目录 一、MVC模式 二、SpringBoot基础——控制层Controller详解 (一)主要工…

MySQL 事务深度解析:面试核心知识点与实战

🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Java 中 MySQL 事务深度解析:面试…

【趣味Html】第11课:动态闪烁发光粒子五角星

打造炫酷的动态闪烁发光粒子五角星效果 前言 在现代Web开发中,视觉效果的重要性不言而喻。今天我们将深入探讨如何使用HTML5 Canvas和JavaScript创建一个令人惊艳的动态闪烁发光粒子五角星效果。这个项目不仅展示了Canvas的强大功能,还涉及了粒子系统、…

6.RV1126-OPENCV 形态学基础膨胀及腐蚀

一.膨胀 1.膨胀原理 膨胀的本质就是通过微积分的转换,将图像A和图形B进行卷积操作合并成一个AB图像。核就是指任意的形状或者大小的图形B。例如下图,将核(也就是图形B)通过微积分卷积,和图像A合并成一个图像AB。 2.特点 图像就会更加明亮 …

机器学习实战37-基于情感字典和机器学习的股市舆情分析可视化系统

文章目录 一、项目背景数字时代情感分析情况二、项目流程1.数据采集与预处理2.复合情感分析模型构建3.舆情分析可视化:三、机器学习算法原理1.支持向量机基础2.核函数与高维映射3.情感分类特征融合4.模型训练与优化四、实现代码五、系统特点与优势1.复合情感分析模型2.多维度可…

STM32F407VET6学习笔记9:编译输出固定大小.bin文件

今日学习如何输出固定大小的.bin编译文件 目录 Keil_V5 fromelf.exe 软件目录: 魔棒添加命令输出bin文件: 输出固定大小的bin文件: 计算bin文件大小: 安装 SRecord 工具集: 使用SRecord: 参考文章&#…

【Web应用】若依框架:基础篇14 源码阅读-后端代码分析

文章目录 ⭐前言⭐一、课程讲解⭐总结 标题详情作者JosieBook头衔CSDN博客专家资格、阿里云社区专家博主、软件设计工程师博客内容开源、框架、软件工程、全栈(,NET/Java/Python/C)、数据库、操作系统、大数据、人工智能、工控、网络、程序人生口号成为你…

Java 单例模式详解

目录 1. 饿汉式(Eager Initialization) 2. 懒汉式(Lazy Initialization) 3. 懒汉式 同步锁(线程安全) 4. 双重检查锁(Double-Checked Locking) 5. 静态内部类(推荐…

从 AMQP 到 RabbitMQ:核心组件设计与工作原理(一)

一、引言 ** 在当今分布式系统盛行的时代,消息队列作为一种关键的中间件技术,承担着系统间异步通信、解耦和削峰填谷的重要职责。AMQP(Advanced Message Queuing Protocol)作为一种高级消息队列协议,为消息队列的实现…

概率单纯形(Probability Simplex)

目录 定义性质在统计学中的应用在机器学习中的应用在信息论中的应用在优化问题中的应用在其他领域的应用 定义 定义:在数学中,概率单纯形(Probability Simplex)是指在 n n n维空间中,所有分量非负且分量之和为1的向量…

项目练习:Vue2中el-button上的@click事件失效

文章目录 一、问题描述二、解决 一、问题描述 button按钮上绑定了一个click事件 对应的方法写在methods中 但是&#xff0c;测试点击时&#xff0c;无法触发函数 二、解决 1、问题代码 <el-buttonclick"changeConfirm(Y)"type"success"plainicon&qu…

十六、【前端强化篇】完善 TestCase 编辑器:支持 API 结构化定义与断言配置

【前端强化篇】完善 TestCase 编辑器:支持 API 结构化定义与断言配置 前言准备工作第一步:更新前端 `TestCase` 类型定义第二步:改造 `TestCaseEditView.vue` 表单第三步:修改后端代码中的TestCase模型和序列化器第四步:测试强化后的用例编辑器总结前言 在之前的后端文章…

HTTP连接管理——短连接,长连接,HTTP 流水线

连接管理是一个 HTTP 的关键话题&#xff1a;打开和保持连接在很大程度上影响着网站和 Web 应用程序的性能。在 HTTP/1.x 里有多种模型&#xff1a;短连接、_长连接_和 HTTP 流水线。 下面分别来详细解释 短连接 HTTP 协议最初&#xff08;0.9/1.0&#xff09;是个非常简单的…

MySQL范式和反范式

范式 是用一组规则定义的数据库设计标准&#xff0c;旨在确保数据库结构合理&#xff0c;避免数据冗余和异常。 目的 消除数据的重复&#xff0c;提高存储效率防止数据异常&#xff08;插入、删除、更新异常&#xff09;提高数据的完整性和一致性 第一范式 定义 所有列&am…

编程技能:格式化打印04,sprintf

专栏导航 本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏&#xff0c;故划分为两个专栏导航。读者可以自行选择前往哪个专栏。 &#xff08;一&#xff09;WIn32 专栏导航 上一篇&#xff1a;编程技能&#xff1a;格式化打印03&#xff0c;printf 回到目录…

JavaScript性能优化实战:深入探讨JavaScript性能瓶颈与优化技巧

引言:为什么JavaScript性能至关重要 在现代Web开发中,JavaScript已成为构建交互式应用程序的核心技术。随着单页应用(SPA)和复杂前端架构的普及,JavaScript代码的性能直接影响用户体验、转化率甚至搜索引擎排名。研究表明,页面加载时间每增加1秒,转化率可能下降7%,而性能…

Java数据结构——八大排序

排序 插⼊排序希尔排序直接选择排序堆排序冒泡排序快速排序归并排序计数排序 排序的概念 排序&#xff1a;就是将一串东西&#xff0c;按照要求进行排序&#xff0c;按照递增或递减排序起来 稳定性&#xff1a;就是比如排序中有两个相同的数&#xff0c;如果排序后&#xff0c…

WPF响应式UI的基础:INotifyPropertyChanged

INotifyPropertyChanged 1 实现基础接口2 CallerMemberName优化3 数据更新触发策略4 高级应用技巧4.1 表达式树优化4.2 性能优化模式4.3 跨平台兼容实现 5 常见错误排查 在WPF的MVVM架构中&#xff0c; INotifyPropertyChanged是实现数据驱动界面的核心机制。本章将深入解析属…