【设计模式】策略模式+门面模式设计对接银行接口的API

在Ubuntu 22.04上从零搭建TrinityCore 3.3.5服务器:一份保姆级避坑指南 本文详细介绍了在Ubuntu 22.04系统上从零搭建TrinityCore 3.3.5服务器的完整流程,包括环境准备、源码编译、数据库配置、资源文件处理及性能调优等关键步骤。特别针对国内开发者和低配置用户优化,提供保姆级避坑指南,帮助用户高效搭建魔兽世界经典旧世版本私服。 阅读详情

Talk is cheap, show me the code.

背景

项目中要用对接 10 家银行的支付接口、余额查询、流水交易结果查询等接口
作者将尝试使用策略模式 + 门面模式设计一下API,增加 API 的易用性

一、定义银行操作的统一接口(策略接口)

// 1. 定义银行操作的统一接口(策略接口)
public interface BankOperations {
    PaymentResult doPayment(PaymentRequest request);
    BalanceResult queryBalance(BalanceRequest request);
    TransactionResult queryTransaction(TransactionRequest request);
}

二、各银行实现类

工商银行

// 2. 各银行实现类
public class ICBCBankOperations implements BankOperations {
    @Override
    public PaymentResult doPayment(PaymentRequest request) {
        // 工商银行支付实现
        return null;
    }

    @Override
    public BalanceResult queryBalance(BalanceRequest request) {
        // 工商银行余额查询实现
        return null;
    }

    @Override
    public TransactionResult queryTransaction(TransactionRequest request) {
        // 工商银行交易查询实现
        return null;
    }
}

农业银行

public class ABCBankOperations implements BankOperations {
    // 农业银行实现...
}

建设银行

public class CCBBankOperations implements BankOperations {
    // 建设银行实现...
}

三、银行类型枚举

// 3. 银行类型枚举
public enum BankType {
    ICBC, ABC, CCB
}

四、统一的请求和响应对象

// 4. 统一的请求和响应对象
@Data
public class PaymentRequest {
    private String accountNo;
    private BigDecimal amount;
    private String currency;
    private String purpose;
    // 其他通用支付参数...
}

@Data
public class PaymentResult {
    private String transactionId;
    private String status;
    private String message;
    // 其他通用返回字段...
}

五、银行操作工厂

// 5. 银行操作工厂
@Component
public class BankOperationsFactory {
    private final Map<BankType, BankOperations> operationsMap = new HashMap<>();

    @Autowired
    public BankOperationsFactory(List<BankOperations> operations) {
        // 初始化银行操作实现映射
        operations.forEach(operation -> {
            if (operation instanceof ICBCBankOperations) {
                operationsMap.put(BankType.ICBC, operation);
            } else if (operation instanceof ABCBankOperations) {
                operationsMap.put(BankType.ABC, operation);
            } else if (operation instanceof CCBBankOperations) {
                operationsMap.put(BankType.CCB, operation);
            }
        });
    }

    public BankOperations getOperation(BankType bankType) {
        return operationsMap.get(bankType);
    }
}

六、门面类 - 提供统一的接口访问点

// 6. 门面类 - 提供统一的接口访问点
@Service
public class BankServiceFacade {
    private final BankOperationsFactory factory;
    
    @Autowired
    public BankServiceFacade(BankOperationsFactory factory) {
        this.factory = factory;
    }

    public PaymentResult doPayment(BankType bankType, PaymentRequest request) {
        try {
            BankOperations operations = factory.getOperation(bankType);
            return operations.doPayment(request);
        } catch (Exception e) {
            log.error("Payment failed", e);
            return PaymentResult.builder()
                    .status("FAILED")
                    .message(e.getMessage())
                    .build();
        }
    }

    public BalanceResult queryBalance(BankType bankType, BalanceRequest request) {
        try {
            BankOperations operations = factory.getOperation(bankType);
            return operations.queryBalance(request);
        } catch (Exception e) {
            log.error("Balance query failed", e);
            return BalanceResult.builder()
                    .status("FAILED")
                    .message(e.getMessage())
                    .build();
        }
    }

    public TransactionResult queryTransaction(BankType bankType, TransactionRequest request) {
        try {
            BankOperations operations = factory.getOperation(bankType);
            return operations.queryTransaction(request);
        } catch (Exception e) {
            log.error("Transaction query failed", e);
            return TransactionResult.builder()
                    .status("FAILED")
                    .message(e.getMessage())
                    .build();
        }
    }
}

七、使用示例

// 7. 使用示例
@Service
public class PaymentService {
    @Autowired
    private BankServiceFacade bankService;

    public void processPayment() {
        PaymentRequest request = new PaymentRequest();
        request.setAccountNo("1234567890");
        request.setAmount(new BigDecimal("100.00"));
        
        // 调用工商银行支付
        PaymentResult result = bankService.doPayment(BankType.ICBC, request);
        
        // 处理支付结果...
    }
}

设计说明

  1. 策略模式:

    • BankOperations 接口定义了所有银行操作的统一接口
    • 每个银行都有自己的实现类(ICBCBankOperations, ABCBankOperations, CCBBankOperations)
    • 通过工厂类动态选择具体的实现
  2. 门面模式:

    • BankServiceFacade 提供了一个统一的访问点
    • 封装了异常处理和日志记录
    • 简化了客户端的调用方式
  3. 扩展性:

    • 添加新银行只需要:
      1. 实现 BankOperations 接口
      2. 在 BankType 中添加新的枚举值
      3. 在工厂类中注册新的实现
  4. 可维护性:

    • 每个银行的实现相互独立
    • 共用的代码抽取到基类或工具类
    • 统一的异常处理和日志记录
  5. 使用建议:

    • 可以添加配置类管理银行的连接参数
    • 可以使用适配器模式处理不同银行的返回格式
    • 可以添加重试机制和熔断机制
    • 建议添加参数验证和安全检查

这样的设计让代码结构清晰,易于维护和扩展,同时也提供了良好的用户体验。

Java全栈开发:充电桩管理系统项目实战 技术收获深入理解分布式系统架构掌握高并发场景解决方案提升系统设计能力经验教训前期需求分析的重要性技术选型需要考虑长期维护测试覆盖率的重要性未来展望引入AI预测故障支持更多支付方式优化用户体验通过此项目的开发,不仅实现了充电桩的智能化管理,也积累了宝贵的全栈开发经验。项目中的很多技术方案和架构设计都具有普遍适用性,可以在其他类似项目中借鉴使用。@Componentstatic {// 初始化状态转换规则。 阅读详情

相关推荐

ENVI-met新手必看:从零开始创建城市微气候模型(附详细步骤+底图制作技巧)

本文为ENVI-met新手提供从零开始创建城市微气候模型的详细指南,包括环境准备、参数配置、底图制作技巧和三维模型构建步骤。特别针对常见问题提供解决方案,帮助初学者快速掌握城市微气候模拟技术,提升建模效率。

weixin_29269441的博客 404

策略模式+模板方法+工厂模式最佳实践

场景。

翁也 696

Basilisk vs. STK:开源航天仿真工具在Windows上的实战体验与生态对比

本文对比了开源航天仿真工具Basilisk与商业软件STK在Windows平台上的实战体验与生态差异。从技术架构、安装配置、使用成本、功能覆盖、社区生态到适用场景,全面分析了二者的优劣势,为航天工程师和研究人员提供选型参考。Basilisk在性能和扩展性上表现突出,而STK在可视化与专业模块上更具优势。

weixin_30632089的博客 588

接口常用设计模式

适配器模式: 在日常生活中,会经常遇到一些适配器,例如笔记本电脑的变压器,究竟是电影的电源适配器。 比如说:电脑笔记本电脑只接受15V的电压,因此不能和直接220V的电源插座连接,电源适配器能够把220V的电压转换为15v,它是链接笔记本电脑何普通电源的桥梁。 在面向对象的领域,也采用适配器模式来进行接口的转换 适配器模式有两种方式:1  继承实现方式    SourceFC...

makemyownlife 516

通义千问对接FreeSWITCH实现大模型呼叫中心

通义千问是由阿里云开发的大规模语言模型,具备优秀的自然语言处理能力,支持文本生成、问答对话、摘要提取等多种任务。它不仅拥有丰富的知识储备,还能根据上下文灵活调整回答策略,适用于各种复杂场景下的自动化交流。FreeSWITCH是一个开源的多媒体通信服务器,提供了包括VoIP通话、即时消息传递在内的多种通信服务。它的模块化设计允许开发者根据实际需求定制功能,广泛应用于企业级通信系统中。通过集成通义千问,FreeSWITCH能够实现更智能的客户服务体验。

技术永不眠 Q:53195017 1498

DFIG风电场经LCC-HVDC外送系统SIMULINK建模与仿真

本文基于MATLAB/Simulink平台构建了DFIG风电场经LCC-HVDC外送系统的仿真模型。系统采用1000MW聚合DFIG模型与双极12脉动LCC-HVDC连接,详细阐述了参数设计、控制策略及接口协调方法。重点解决了风电场无功能力不足、功率波动影响换相等关键技术问题,为大规模风电基地外送提供了仿真研究框架。模型整合了官方DFIG和HVDC详细模块,通过参数缩放和控制系统优化,实现了完整系统的动态仿真分析。

huanghm88的专栏 118

接口(策略设计模式)

总结接口的知识点 (菜鸟一只,有侵权或者不足之处请指出,谢谢) Java接口    接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。语法:使用关键字interface关键字来定义。注意:定义的接口文件仍然是.java文件。虽然声明的时候使用interf...

aihuai2731的博客 385

Unity中使用TCP和UDP传输摄像头视频的实践

本文探讨了在Unity中通过TCP和UDP协议传输摄像头视频的实现方法。TCP通过自定义消息帧保证数据完整性但效率较低,UDP传输速度快但可能丢帧。文章提供了Python和Unity的代码示例,分析了两种协议的适用场景:TCP适合要求数据完整性的应用,UDP则适合追求实时性的场景。最终选择取决于具体需求,并需要注意线程安全与同步机制。

m0_74337424的博客 145

总结接口与接口引申出的几种设计模式

总结接口与接口引申出的几种设计模式接口引申出的两种设计模式代码适配器设计模式代码复用以上内容自己整理于Thing In Java接口一章内容 接口 接口的概念和使用应该很熟悉,但是设计模式和接口的真正意义一直很模糊,所以总结一下。总之就是使用接口可以使自己的代码复用性更好。 引申出的两种设计模式 创建一个能够根据所传递的参数对象的不同而具有不同行为的方法:被称为策略设计模式。这类方法包含要执行的算法中固定不变的部分,而“策略”包含变化的部分。策略就是传递进去的参数对象,它包含要执行的代码 适配器设计模式:无

凄戚的博客 897

【AI大模型应用开发】3.2 RAG实战 - RAG应用+UI实现加载本地文件并对话

前面我们实现了RAG基本流程,今天我们在此基础上给它加个UI界面,在浏览器打开,实现上传本地文件、解析,并用大模型实现与该文档的对话。也就是一个阉割版demo版的ChatPDF或知识库对话系统。

同学小张的博客 3051

Linux系列:SecurtCRT中的密码如何找回

【代码】Linux系列:SecurtCRT中的密码如何找回。

NIO4444 1084

设计模式之适配器模式

适配器模式 定义 ​​适配器模式(Adapter Pattern)是指将一个类的接口转换成客户期望的另一个接口,使原本的接口不兼容的类可以一起工作,属于结构型设计模式。 适用场景 1、已经存在的类,它的方法和需求不匹配(方法结果相同或相似)的情况。 2、适配器模式不是软件设计阶段考虑的设计模式,是随着软件维护,由于不同产品、不同厂家造成功能类似而接口不相同情况下的解决方案。有点亡羊补牢的感觉。 实例 我们现在的登录有很多种,QQ、微信等,我们利用适配模式来写下这个代码 ...

JackRen_Developer的博客 395

【Unity实战篇 】| Unity实现 文本框可以自适应大小,到达最大宽度之后再缩小字体

Unity实现 Text文本框可以自适应大小,到达最大宽度之后再缩小字体 需求:在文本框可以自适应大小拉伸的前提下,增加一个最大限制宽度,使其到达最大宽度后 再启用 Best Fit 实现自适应改变文字大小以适应文本框的大小。 在Unity中经常会用到文本组件的自适应大小功能,一般使用HorizontalLayoutGroup和ContentSizeFitter组件配合即可实现文本自适应的效果。

努力前行,总会成为自己心中的那道光 3万+

设计模式-策略模式

策略模式(strategy pattern)的原始定义是:定义一系列算法,将每一个算法封装起来,并使它们可以相互替换。策略模式让算法可以独立于使用它的客户端而变化。

鱼粉大王 8520

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

设计模式-策略模式详解

策略模式是一种行为设计模式,它通过定义算法家族并将每个算法封装为独立类,使它们可以相互替换。该模式解决了硬编码多种实现方式导致的代码臃肿问题,将算法使用与实现分离。核心结构包括策略接口、具体策略类和上下文类。以支付功能为例,策略模式将支付宝、微信支付等不同支付方式封装为独立策略类,通过上下文类统一调用,避免了大量if-else判断,提高了代码的可维护性和扩展性,符合开闭原则。

qq_36944952的博客 1518

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

23种设计模式一策略模式

策略模式是一种行为型设计模式,用于将算法定义与使用分离,使算法可以独立变化。它通过定义抽象策略接口(如支付策略)、实现具体策略类(如微信支付、支付宝支付等)和使用环境类(如购物车上下文)来管理策略的切换和执行。这种模式能消除复杂的条件判断,提高代码可维护性和复用性,符合开闭原则,是框架开发中常用的设计模式之一。

J_liaty的博客 1104

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

23种设计模式-策略模式

一文搞懂策略模式

weixin_45897786的博客 1020

Java 设计模式之策略模式:灵活切换算法的艺术

策略模式是一种行为型设计模式,通过定义算法族并封装每个算法,使其可以相互替换,实现算法的灵活切换。本文以购物车支付系统为例,演示了策略模式的实现方式:1)定义PaymentStrategy接口作为抽象策略;2)实现微信、支付宝、银行卡等具体支付策略;3)通过ShoppingCart环境类动态切换支付方式。该模式将算法与使用解耦,避免了条件语句的硬编码,提高了系统的扩展性和可维护性。在实际开发中,策略模式适用于需要动态切换算法或行为的场景,如支付方式、排序算法等。

三两肉的博客 1211

C++设计模式之行为型模式:策略模式(Strategy)

策略模式是一种行为型设计模式,通过封装可互换的算法,实现运行时动态切换。核心思想是将算法定义与使用分离,由抽象策略定义接口,具体策略实现算法逻辑,环境类负责持有和调用策略。该模式适用于多种算法可选、需要动态切换的场景,如支付方式选择、排序算法等。其优势在于解耦算法与客户端、支持灵活切换、符合开闭原则。实践中可结合工厂模式创建策略对象,并注意避免策略类过度膨胀。

bkspiderx的博客 1848

设计模式之策略模式

1 违反开闭原则(OCP)// 新增支付方式需要修改原有代码if (type == "alipay") { /* 支付宝逻辑 */ }else if (type == "wechat") { /* 微信逻辑 */ }else if (type == "creditcard") { /* 信用卡逻辑 */ }else if (type == "coupon") { /* 优惠券逻辑 */ }// 新增PayPal支付需要在这里添加else if。

Anurmy的博客 463

java设计模式---策略模式

策略设计模式是一种行为设计模式。当在处理一个业务时,有多种处理方式,并且需要再运行时决定使哪一种具体实现时,就会使用策略模式。如果在一个系统里面有许多类,它们仅仅在行为上有区别,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为;一个系统需要动态地在几种算法中选择一种;如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

qq_53844452的博客 836

设计模式(一) 支付策略模式

使用场景 公司最近在做直播功能,底层原来有一套直播API,现在新增一套网宿直播API。考虑以后的扩展性,需要将两套API进行统一管理。现在以网上的支付方式演示我对策略模式的理解。 支付方式 我们知道网上有很多支付方式。支付宝、微信、银行卡、花呗...我们以三种支付方式进行演示。 策略模式的组成有三部分 环境类(Context):用一个ConcreteStrategy...

来杯特仑苏的博客 1936

Java 23 种设计模式:从踩坑到精通 | 策略模式 —— 算法族的封装与切换,告别 if-else

摘要:当同一个操作有多种算法实现,且需要根据场景灵活切换时,if-else 或 switch 会将所有算法混杂在一起,导致逻辑臃肿、扩展困难。策略模式将每个算法封装为独立的策略类,使它们可以相互替换,且算法的变化不影响使用算法的客户端。本文从电商促销策略的场景出发,完整讲解策略模式的原理、UML、代码实现、与状态模式的区别,并结合电子面单多平台架构实战、JDK 排序比较器、Spring 资源加载等应用,帮你掌握“算法对象化”的设计精髓。

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 1742

Java设计模式-策略模式

摘要:策略模式是一种行为型设计模式,通过将算法封装成独立类(策略)实现运行时动态切换。核心包含抽象策略接口、具体策略实现类和上下文类。相比传统if-else实现,策略模式能消除条件判断、提高扩展性(开闭原则)和复用性。典型应用如支付方式选择,案例展示了电商系统中支付宝、微信等支付策略的优雅实现方式,上下文类仅持有策略引用并委托执行,实现算法与使用的解耦。

weixin_66095070的博客 670

【软件设计】23 种设计模式解析与实践指南

掌握多种设计模式,能够让开发者在面对不同的项目需求时,灵活地选择合适的模式,从而提高软件的质量和开发效率。设计模式(Design Pattern)是软件开发中反复出现的问题的解决方案,由 Erich Gamma 等四人组(GoF)在 1994 年系统化提出。文档编辑器(树形结构管理 + 格式装饰 + 保存策略 + 实时预览)。

wnm23的专栏 3101

Java设计模式系列 - 策略模式

想象一个场景:你的系统里有一个计算价格的功能。最开始,只有普通用户,不打折。后来来了老用户,要打95折。再后来来了VIP,要打8折。你的代码是不是这样演变的?问题来了,每加一种用户类型,你就要来改这个方法的if-else。这违反了(对扩展开放,对修改关闭)。而且,如果折扣逻辑很复杂,这个方法会迅速膨胀,变成一坨“屎山”。

qq_40668700的博客 580
上一篇: 【Exception】MybatisPlusException: can not find lambda cache for this entity
tanpenggood
博客等级 码龄9年 129粉丝 197原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值