关于同一接口有多个不同实现的设计方案

关于同一接口有多个不同实现的设计方案

前言

最近公司做了一个银行相关的项目,告诉我公司对接了多个银行的支付,每个银行都有对应的接口要去对接,比如:交易申请,交易取消,支付,回单,交易记录查询等等;这次让我写的是工商银行的支付接口对接,于是我看了下代码,因为比较敏感,所以给大家简单写一下怎么实现的。

public static BankService createService(String bankCode) throws Exception{if (bankCode == null || bankCode.length() == 0){throw new ClassNotFoundException("BankCode: is null !");}else if(BankCode.ZHENGZHOU_BANK.getCode().equals(bankCode)){return ApplicationContextUtils.getBean(ZhengzhouBankServiceImpl.class);}else if(BankCode.ZHONGYUAN_BANK.getCode().equals(bankCode)){return ApplicationContextUtils.getBean(ZhongyuanBankServiceImpl.class);}else if(BankCode.YOUZHENG_BANK.getCode().equals(bankCode)){return ApplicationContextUtils.getBean(YouzhengBankServiceImpl.class);}else if(BankCode.NONGSHANG_BANK.getCode().equals(bankCode)){return ApplicationContextUtils.getBean(NongshangBankServiceImpl.class);}else if(BankCode.GONGSHANG_BANK.getCode().equals(bankCode)){return ApplicationContextUtils.getBean(GongshangBankServiceImpl.class);}else if(BankCode.XINJIANGNCXYS_BANK.getCode().equals(bankCode)) {NcxysBankServiceImpl bean = ApplicationContextUtils.getBean(NcxysBankServiceImpl.class);return bean;}else if(BankCode.JINAHANG_BANK.getCode().equals(bankCode)){return ApplicationContextUtils.getBean(JianSheBankServiceImpl.class);}else if(BankCode.XINJIANGNNONGYE_BANK.getCode().equals(bankCode)){return ApplicationContextUtils.getBean(NongYeBankServiceImpl.class);}else if(BankCode.ZHONGUO_BANK.getCode().equals(bankCode)){return ApplicationContextUtils.getBean(ZhongGuoBankServiceImpl.class);}else if(BankCode.PINGAN_BANK.getCode().equals(bankCode)){return ApplicationContextUtils.getBean(PingAnBankServiceImpl.class);}else if(BankCode.HAINANNCXYS_BANK.getCode().equals(bankCode)){return ApplicationContextUtils.getBean(HaiNanNcxysBankServiceImpl.class);}else if(BankCode.HAMI_BANK.getCode().equals(bankCode)){return ApplicationContextUtils.getBean(HaMiBankServiceImpl.class);}else{throw new ClassNotFoundException("BankCode: " + bankCode + " 暂未开通接口服务 !");}}

看上去是不是有点头皮发麻,于是我想到有些其他的场景也会这样,比如订单的流转,可能每个状态的订单都会有不同的实现,是不是可以优化一下,不让代码出现这么多的if else。

整活

利用抽象类

抽象类,大家都知道,我们可以把接口写在抽象类里,也可以把方法在抽象类里实现,我们可以借助抽象类的特性,在抽象类中定义好方法和接口,如果这个功能所有的实现类都要实现,那么我们就把接口定义成接口,如果只是某些实现类需要实现的方法,我们就把接口给它实现,直接上代码!
在这里插入图片描述
比如pay方法,所有的银行都必须要实现的方法,我就给它定义成抽象方法;transaction方法,只是某个实现类需要实现的方法,我就给直接把方法实现,并抛出异常,意识是没有权限访问。

实现抽象类

在实现抽象类之前,我们要定义每个实现类的编码,这个一定是写死的,比方订单状态,1就是待接单2就是待支付,这个是不可能变得;银行编码001就是工商银行也永远不会变的。再次上代码!
在这里插入图片描述
我在每个实现类的@Service上都定义了实现类的命名,然后注意,三个实现类我都实现了pay方法,这是必须的,不实现就报错,但是GongShangHandler还实现了transaction方法,那调用这个方法的时候就会进入到具体的实现类里,不会抛出NO POWER的异常。

controller的编写

在这里插入图片描述
使用spring的特性,用map来接受这些Service,map的key就是我们@service里的命名,也就是001,002,003。然后我们直接用map去get传过来code编码,直接就可以获取到实现类,就不需要多个if else判断了。

测试结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

rabbitMQ发布确认-交换机不存在或者无法抵达队列的缓存处理

rabbitMQ在发送消息时,会出现交换机不存在(交换机名字写错等消息),这种情况如何会退给生产者重新处理?【交换机层】 生产者发送消息时,消息未送达到指定的队列,如何消息回退? 核心&…

麒麟KYSEC使用方法05-命令设置密码强度

原文链接:麒麟KYSEC使用方法05-命令设置密码强度 hello,大家好啊,今天给大家带来麒麟KYLINOS的kysec使用方法系列文章第五篇内容----使用命令设置密码强度,密码强度策略有两个文件需要修改,pwquality.conf/login.defs&…

命令执行总结

之前做了一大堆的题目 都没有进行总结 现在来总结一下命令执行 我遇到的内容 这里我打算按照过滤进行总结 依据我做过的题目 过滤system 下面是一些常见的命令执行内容 system() passthru() exec() shell_exec() popen() proc_open() pcntl_exec() 反引号 同shell_exec() …

大语言模型概述(三):基于亚马逊云科技的研究分析与实践

上期介绍了基于亚马逊云科技的大语言模型相关研究方向,以及大语言模型的训练和构建优化。本期将介绍大语言模型训练在亚马逊云科技上的最佳实践。 大语言模型训练在亚马逊云科技上的最佳实践 本章节内容,将重点关注大语言模型在亚马逊云科技上的最佳训…

解决Chrome浏览器无法启动,因为应用程序的并行配置不正确

目录 现象 方法1 方法2 附带:书签路径 一次比较奇怪的问题,花了一些时间,记录下来。 现象 进到本机默认安装路径: C:\Users\你的用户名\AppData\Local\Google\Chrome\Application 下面会有个版本号的目录,如我的…

快手ConnectionError

因为运行的程序被中断导致 top然后查看站用处内存高的accelerate kill进程号 9回车

linux基础5:linux进程1(冯诺依曼体系结构+os管理+进程状态1)

冯诺依曼体系结构os管理 一.冯诺依曼体系结构:1.简单介绍(准备一)2.场景:1.程序的运行:2.登录qq发送消息: 3.为什么需要内存:1.简单的引入:2.计算机存储体系:3.内存的意义…

微服务知识小结

1. SOA、分布式、微服务之间有什么关系和区别? 1.分布式架构指将单体架构中的各个部分拆分,然后部署到不同的机器或进程中去,SOA和微服务基本上都是分布式架构的 2. SOA是一种面向服务的架构,系统的所有服务都注册在总线上&#…

让工作效率提升10倍:十大AIGC工具评测【建议收藏】

AI技术的普及已经在近年来不断增长。这种技术已经改变了我们与电脑的互动方式,让我们能够更高效、更自然地完成任务。本文将展示10个基于ChatGPT、GPT-3.5和 GPT-4.0 AI模型构建的最强大的资源,使您更容易充分利用它们的潜力。因此,如果您想利…

详解深度学习中的图神经网络GNN

引言 图神经网络GNN是深度学习的一个分支。 深度学习的四个分支对应了四种常见的数据格式,前馈神经网络FNN处理表格数据,表格数据可以是特征向量,卷积神经网络CNN处理图像数据,循环神经网络RNN处理时序数据,图神经网…

c++|类和对象(上)

目录 一、面向过程和面向对象初步认识 二、类的引入和定义 2.1类的引入 2.2类的定义 三、类的访问限定符及封装 3.1访问限定符 3.2封装 四、类的作用域 五、类的实例化 六、类的对象大小的计算 6.1如何计算对象的大小 6.2类对象的存储方式 七、类成员函数的thi…

Python-Django的“日志功能-日志模块(logging模块)-日志输出”的功能详解

01-综述 可以使用Python内置的logging模块来实现Django项目的日志记录。 所以与其说这篇文章在讲Django的“日志功能-日志模块-日志输出”,不如说是在讲Pthon的“日志功能-日志模块-日志输出”,即Python的logging模块。 下面用一个实例来进行讲解。 …

2023年亚太杯数学建模A题水果采摘机器人的图像识别功能(免费思路)

中国是世界上最大的苹果生产国,年产量约为 3500 万吨。同时,中国也是世界上最大的苹果出口国,世界上每两个苹果中就有一个出口到国。世界上每两个苹果中就有一个来自中国,中国出口的苹果占全球出口量的六分之一以上。来自中国。中…

基于51单片机超声波测距汽车避障系统

**单片机设计介绍, 基于51单片机超声波测距汽车避障系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于51单片机的超声波测距汽车避障系统是一种用于帮助汽车避免碰撞和发生事故的设备,以下是一个基本…

Visual Studio 2022安装教程(千字图文详解),手把手带你安装运行VS2022以及背景图设置

VS2022最新最全安装教程 很高兴你打开了这篇博客,接下来我们一起安装并且使用VS2022吧 文章目录 VS2022最新最全安装教程一.官网下载二.安装启动三.项目测试1.创建新项目2.选择我们使用的模板(C空项目),继续冲!3.进入…

docker的使用方法

文章目录 为什么要用dockerdocker安装docker工作原理docker命令docker搭建练习docker可视化docker镜像docker容器数据卷DockerFiledocker全流程Docker网络原理docker composedocker swarm 为什么要用docker 官网:https://www.docker.com文档地址:https:…

系列五、声明式事务(xml方式)

一、概述 声明式事务(declarative transaction management)是Spring提供的对程序事务管理的一种方式,Spring的声明式事务顾名思义就是采用声明的方式来处理事务。这里所说的声明,是指在配置文件中声明,用在Spring配置文件中声明式的处理事务来…

搞笑的客服日常,今天遇到的晒白客服,你遇到过吗?

大家看看这个 https://blog.csdn.net/a871923942/article/details/129778391?utm_mediumdistribute.pc_feed_404.none-task-blog-2 今天遇到傻逼审核 开头第一句就使用快捷话术 客服感觉自己发错了 然后就撤回消息 第二次继续发话术,说违规,审核不通过…

案例015:Java+SSM+uniapp基于微信小程序的校园防疫系统

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…