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

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

前言

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

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.hqwc.cn/news/214027.html

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

相关文章

小程序中的大道理--综述

前言 以下将用一个小程序来探讨一些大道理, 这些大道理包括可扩展性, 抽象与封装, 可维护性, 健壮性, 团队合作, 工具的利用, 可测试性, 自顶向下, 分而治之, 分层, 可读性, 模块化, 松耦合, MVC, 领域模型, 甚至对称性, 香农的信息论等等. 为什么不用大程序来说大道理呢? …

2023年汉字小达人市级比赛题目类型和答题策略(在线模拟题更新)

今天是2023年11月24日,距离2023年第十届上海市小学生汉字小达人市级比赛(市级活动)正式举办还有6天时间。 根据日常交流,六分成长发现还有一些家长和小朋友对汉字小达人的市级比赛的形式、题型不太了解,为此&#xff0…

短视频获客系统成功分享,与其开发流程与涉及到的技术

先来看实操成果,↑↑需要的同学可看我名字↖↖↖↖↖,或评论888无偿分享 一、短视频获客系统的开发流程 1. 需求分析:首先需要对目标用户进行深入了解,明确系统的功能和目标,制定详细的需求文档。 2. 系统设计&#…

【DevOps】Git 图文详解(九):工作中的 Git 实践

本系列包含: Git 图文详解(一):简介及基础概念Git 图文详解(二):Git 安装及配置Git 图文详解(三):常用的 Git GUIGit 图文详解(四)&a…

H5(uniapp)中使用echarts

1,安装echarts npm install echarts 2&#xff0c;具体页面 <template><view class"container notice-list"><view><view class"aa" id"main" style"width: 500px; height: 400px;"></view></v…

G1垃圾收集器

1.G1的目的&#xff1a; Garbage First&#xff0c;也就是垃圾优先原则&#xff0c;也就是空间方面的关注点。同时照顾到停顿时间以及吞吐量。 G1垃圾收集器的设计目的是避免完全回收&#xff0c;但是当并发收集不能足够快地回收内存时&#xff0c;就会发生完全回收GC。G1的完…

学习视频剪辑方法:AI智剪助力,批量处理短视频无忧

随着短视频的兴起&#xff0c;越来越多的人开始关注如何有效地制作和发布这些内容。但是&#xff0c;短视频的制作并不容易&#xff0c;要耗费大量的时间和精力。现在有很多AI智能剪辑工具可以快速、高效地制作短视频。其中&#xff0c;AI智剪是一款非常受欢迎的视频剪辑功能&a…

关于python 语音转字幕,字幕转语音大杂烩

文字转语音 Python语音合成之第三方库gTTs/pyttsx3/speech横评(内附使用方法)_python_脚本之家 代码示例 from gtts import gTTStts gTTS(你好你在哪儿&#xff01;,langzh-CN)tts.save(hello.mp3)import pyttsx3engine pyttsx3.init() #创建对象"""语速"…

12V降3.3V100mA稳压芯片WT7133

12V降3.3V100mA稳压芯片WT7133 WT71XX系列是一款采用CMOS工艺实现的三端高输入电压、低压差、小输出电流电压稳压器。 它的输出电流可达到100mA&#xff0c;输入电压可达到18V。其固定输出电压的范围是2.5V&#xff5e;8.0V&#xff0c;用户 也可通过外围应用电路来实现可变电压…

Element中el-table组件右侧空白隐藏-滚动条

开发情况&#xff1a; 固定table高度时&#xff0c;出现滚动条&#xff0c;我们希望隐藏滚动条&#xff0c;或修改滚动条样式&#xff0c;出现table右边出现15px 的固定留白。 代码示例 <el-table class"controlTable" header-row-class-name"controlHead…

css中flex两列布局(一列自适应其他固定)

问题 最近写一个布局的时候&#xff0c;遇到一个问题。如下图的布局。在没有图片的时候布局是正常的&#xff0c;如果有图片且设置了width:100%;height: 100%; 则会出现图片将自适应布局撑开的情况。 我的解决方式是让图片不缩放&#xff0c;图片外层再添加一个div元素。形如…

如何预防数据泄露?六步策略帮您打造企业信息安全壁垒

大家好&#xff01;我是恒小驰&#xff0c;今天我想和大家聊聊一个非常重要的话题——如何预防数据泄露。在这个数字化的时代&#xff0c;数据已经成为了我们生活中不可或缺的一部分。然而&#xff0c;随着数据的价值日益凸显&#xff0c;数据泄露的风险也随之增加。企业应该如…