基于命令行模式设计退款请求处理

前言

        这篇文章的业务背景是基于我的另一篇文章:

 

对接苹果支付退款退单接口-CSDN博客

       

        然后就是说设计模式是很开放的东西,可能我觉得合适,你可能觉得不合适,这里只是做下讨论,没有一定要各位同意的意思....

相关图文件

        这里我先把相关的图文件放上来,可能看着会比较清晰点

代码逻辑

        先把每个类的代码放上来一下,首先是接口

涉及java类

AppNotifyCommand(这个没啥好说的)

public interface AppNotifyCommand<T extends AppStoreNotifyDto> {//命令定义,可以参考官网//https://developer.apple.com/documentation/appstoreservernotifications/notification_typeString REFUND_COMMAND_NAME = "REFUND";String NOT_FOUND_COMMAND_NAME = "NOT_FOUND";/***  获取命令名称* @return*/String getCommandName();/*** 执行命令* @param T*/String execute(T T);
}

AbstractAppNotifyCommand(抽象类,给子类继承的,还是比较有意义的)

@Slf4j
public abstract class AbstractAppNotifyCommand<T extends AppStoreNotifyDto> implements AppNotifyCommand<T>{@Overridepublic String getCommandName() {String commandName = doGetCommandName();if(StringUtil.isBlank(commandName)) {throw new IllegalArgumentException("commandName为空");}return commandName;}@Overridepublic String execute(T T) {try {return doExecute(T);} catch (Exception e) {log.error("执行具体命令时发生异常", e);throw new AppException("执行具体命令时发生异常", e);}}protected abstract String doGetCommandName();protected abstract String doExecute(T T) throws Exception;}

AppRefundCommand(退款处理类)

@Service
public class AppRefundCommand extends AbstractAppNotifyCommand<AppStoreNotifyDto> {@Overrideprotected String doGetCommandName() {return REFUND_COMMAND_NAME;}@Overrideprotected String doExecute(AppStoreNotifyDto appStoreNotifyDto) throws Exception{//        //获取解密数据
//        AppStoreDecodedPayloadDto appStoreDecodedPayloadDto = parseTransactionInfo(appStoreNotifyDto);
//
//        //退款逻辑处理.....return "执行完成了";}
}

AppNotFoundCommand(找不到对应的处理命令时也写了一个处理类)

@Slf4j
@Service
public class AppNotFoundCommand extends AbstractAppNotifyCommand<AppStoreNotifyDto> {@Overrideprotected String doGetCommandName() {return NOT_FOUND_COMMAND_NAME;}@Overrideprotected String doExecute(AppStoreNotifyDto appStoreNotifyDto) throws Exception {log.info("目前{}的命令没有进行处理,返回空字符串", appStoreNotifyDto.getNotificationType());return "";}
}

        上面的几个类都是基础类,没啥好说的,主要是下面这个类,维护了对外的接口,如下

@Service
@Slf4j
public class AppCommandComposite {@Resourceprivate List<AppNotifyCommand<AppStoreNotifyDto>> appNotifyCommandList;private Map<String, AppNotifyCommand<AppStoreNotifyDto>> appNotifyCommandMap;@PostConstructpublic void init() {appNotifyCommandMap = new ConcurrentHashMap<>();//循环放置数据for (AppNotifyCommand<AppStoreNotifyDto> appNotifyCommand : appNotifyCommandList) {appNotifyCommandMap.put(appNotifyCommand.getCommandName(), appNotifyCommand);}}/*** 执行命令* @param appStoreNotifyPayLoadDto* @return*/public String handleCommand(AppStoreNotifyPayLoadDto appStoreNotifyPayLoadDto) {try {//解密基础数据AppStoreNotifyDto appStoreNotifyDto = AppStoreReturnUtil.verifyAndGet(appStoreNotifyPayLoadDto.getSignedPayload());log.info("开始执行苹果的{}通知命令", appStoreNotifyDto.getNotificationType());//获取安全的执行器执行AppNotifyCommand<AppStoreNotifyDto> appNotifyCommand = appNotifyCommandMap.get(appStoreNotifyDto.getNotificationType());String result = safeAppNotifyCommand(appNotifyCommand).execute(appStoreNotifyDto);log.info("执行苹果的{}通知命令完成,返回的数据为{}", appStoreNotifyDto.getNotificationType(), result);return result;} catch (Exception e) {log.error("解析苹果加密数据失败", e);throw new AppException("解析苹果加密数据失败");}}//获取安全的执行器执行private AppNotifyCommand<AppStoreNotifyDto> safeAppNotifyCommand(AppNotifyCommand<AppStoreNotifyDto> appNotifyCommand) {if(appNotifyCommand == null) {return appNotifyCommandMap.get(AppNotifyCommand.NOT_FOUND_COMMAND_NAME);}return appNotifyCommand;}
}

  设计亮点

        主要在AppCommandComposite类上面,主要用到了如下的一些亮点设计

1. 基于Spring 容器功能收集 以下数据

    @Resource
    private List<AppNotifyCommand<AppStoreNotifyDto>> appNotifyCommandList;

2. 基于Spring Bean的生命周期初始化方法 @PostConstruct 收集到map里面去

   private Map<String, AppNotifyCommand<AppStoreNotifyDto>> appNotifyCommandMap;

3. 对外提供handleCommand 方法, 逻辑如下

        首先对数据进行解密, 这在另外一篇文章说了,这里就不赘述了

        其次根据苹果返回的notificationType获取到具体的命令处理器

        精华在于,获取不到的时候会返回AppNotFoundCommand进行处理,而我们可以打印日志,表明苹果发了哪些请求,到时如果需要处理可以添加AppNotifyCommand实现类处理即可

结语

        总的来说逻辑并不复杂,至于这样设计好不好每个人的看法就当不一样了,我个人是觉得这样的话可以统一很多逻辑,不需要后续的人员再参与,

        不好的地方在于没有专门研究过设计模式的人可能看起来会很复杂,但是只要写好对应的文档其实就可了

        

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

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

相关文章

Web服务器(go net/http) 处理Get、Post请求

大家好 我是寸铁&#x1f44a; 总结了一篇Go Web服务器(go net/http) 处理Get、Post请求的文章✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 go http请求如何编写简单的函数去拿到前端的请求(Get和Post) 服务器(后端)接收到请求后&#xff0c;又是怎么处理请求&#xff0c…

【网络奇缘】- 计算机网络|分层结构|ISO模型

&#x1f308;个人主页: Aileen_0v0&#x1f525;系列专栏: 一见倾心,再见倾城 --- 计算机网络~&#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 计算机网络分层结构 OSI参考模型 OSI模型起源 失败原因: OSI模型组成 协议的作用 &#x1f4dd;全文…

二十四、RestClient操作文档

目录 一、新增文档 1、编写测试代码 二、查询文档 1、编写测试代码 三、删除文档 1、编写测试代码 四、修改文档 1、编写测试代码 五、批量导入文档 批量查询 一、新增文档 1、编写测试代码 SpringBootTest public class HotelDocumentTest {private RestHighLevelC…

【栈】不同字符的最小子序列

题目&#xff1a; /*** 思路&#xff1a;栈,使用数组记录每个字母出现的次数&#xff0c;再用一个数组标记字符是否在栈中* 遍历栈&#xff0c;存储字符时比较栈顶字符&#xff0c;若小于栈顶字符并且后面有重复的字符则* 栈顶元素出栈&#xff0c;否则入栈。** au…

PS 注释工具 基础使用方法讲解

好 上文PS 颜色取样器&标尺工具 基本使用讲解中 我们讲了 颜色取样器和标尺工具的基本用法 下面我们来看一下 注释工具 这个 主要是后面 比较大的作品 可能不是我们一个人取设计 团队作图 就需要用到它 选择 注释工具 后 我们随便点击图像任何一个位置 右侧就会出现一个输…

gitlab各版本安装注意点:

研发团队在安装gitlab各版本过程中可能遇到各种问题&#xff0c;为了后续容易查看特将我们在实践过程中遇到的各类问题要点总结如下&#xff1a; gitlab 10.8.3 (564c342&#xff09;安装 centos Linux yum安装网址查找网址&#xff1a;gitlab/gitlab-ce - Results for gitla…

黑马点评12-实现好友关注/取关功能,查看好友共同关注列表

好友关注 数据模型 数据库中的tb_follow记录博主与粉丝的关系 tb_follow表对应的实体类 Data EqualsAndHashCode(callSuper false) Accessors(chain true) TableName("tb_follow") public class Follow implements Serializable {private static final long ser…

栈和队列的OJ题--12.括号匹配

12.括号匹配 20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a;该题比较简单&#xff0c;是对栈特性很好的应用&#xff0c;具体操作如下&#xff1a;循环遍历String中的字符&#xff0c;逐个取到每个括号&#xff0c;如果该括号是&#xff1a;1. …

Git工作流和Commit规范

Git大家都非常熟悉了&#xff0c;就不做过多介绍&#xff0c;但是如何用好Git、如何进行合理的分支开发、Merge你是否有一个规范流程呢&#xff1f;&#x1f4a4; 不论是一个团队一起开发一个项目&#xff0c;还是自己独立开发一个项目&#xff0c;都少不了要和Git打交道&…

紫光展锐V8821荣获“中国芯”重大创新突破产品奖

近日&#xff0c;“中国芯”优秀产品评选落下帷幕&#xff0c;紫光展锐首颗5G IoT-NTN卫星通信SoC芯片V8821凭借在卫星通信前沿领域的技术创新&#xff0c;从285家芯片企业、398款芯片产品中脱颖而出&#xff0c;荣获第十八届“中国芯”年度重大创新突破产品奖。 “中国芯”优…

ReentrantLock源码解析

ReentrantLock源码解析 文章目录 ReentrantLock源码解析一、ReentrantLock二、ReentrantLock 的 Sync、FairSync、NonfairSync2.1 Sync、FairSync、NonfairSync2.2 NonfairSync 下的 tryAcquire2.3 FairSync下的 tryAcquire2.4 tryRelease 三、lock.lock()3.1 NonfairSync.lock…

4.常见面试题--操作系统

特点&#xff1a;并发性、共享性、虚拟性、异步性。 Windows 和 Linux 内核差异 对于内核的架构⼀般有这三种类型&#xff1a; ● 宏内核&#xff0c;包含多个模块&#xff0c;整个内核像⼀个完整的程序&#xff1b; ● 微内核&#xff0c;有⼀个最⼩版本的内核&#xff0…

名字大却不中用的AI大模型,名不副实

这两天 OpenAI 团队&#xff08; ChatGPT 公司&#xff09;的戏比较多&#xff0c;两三天的功夫&#xff0c;剧情发展都超出了 OpenAI 首席科学家的预期&#xff0c;目前来看&#xff0c;微软还是最大的赢家。这是个引子&#xff0c;这个话题&#xff0c;网络上早已传烂了&…

云安全之盾:ZStack 云主机安全防护解决方案全方位保护云环境

随着云计算的蓬勃发展&#xff0c;网络威胁愈发复杂&#xff0c;涵盖了从勒索病毒到APT攻击的各种威胁类型。在这一风云变幻的网络安全环境下&#xff0c;云主机安全不再仅仅是一个选项&#xff0c;它是信息系统安全的核心要素。云轴科技ZStack 云主机安全防护解决方案是为了满…

6.3.WebRTC中的SDP类的结构

在上节课中呢&#xff0c;我向你介绍了sdp协议&#xff0c; 那这节课呢&#xff0c;我们再来看看web rtc中。是如何存储sdp的&#xff1f;也就是sdp的类结构&#xff0c;那在此之前呢&#xff1f;我们先对sdp的内容啊&#xff0c;做一下分类。因为在上节课中呢&#xff0c;虽然…

Python+jieba+wordcloud实现文本分词、词频统计、条形图绘制及不同主题的词云图绘制

目录 序言&#xff1a;第三方库及所需材料函数模块介绍分词词频统计条形图绘制词云绘制主函数 效果预览全部代码 序言&#xff1a;第三方库及所需材料 编程语言&#xff1a;Python3.9。 编程环境&#xff1a;Anaconda3&#xff0c;Spyder5。 使用到的主要第三方库&#xff1a;…

python之pyqt专栏1-环境搭建

#python pyqt# python&#xff1a;3.11.6 pycharm&#xff1a;PyCharm Community Edition 2023.2.5 pyqt6 python安装 官网下载&#xff1a;Python Releases for Windows | Python.org pycharm社区版安装 官网地址&#xff1a;Download PyCharm: Python IDE for Professional…

golang学习笔记——创建项目

创建项目 从Go 1.8开始&#xff0c;将GOPATH设置为环境变量不是必需的。如果我们没有设置一个&#xff0c;Go使用默认的GOPATH为$HOME/go。可以使用go env查看环境变量信息。 创建项目 # 创建项目目录 mkdir helloLog cd helloLog # 使用go mod初始化项目,生成go.mod文件 go…

TikTok shop印尼重启电商征程:与当地平台合作开启新篇章!——站斧浏览器

经历了一个半月的间隔&#xff0c;TikTok Shop成功重返印度尼西亚市场。据国际媒体报道&#xff0c;TikTok计划通过与印尼本地电子商务平台的合作&#xff0c;重启其在该国的电商业务。 Temmy Satya Permana&#xff0c;印尼合作社和中小企业部的官员&#xff0c;证实了这一重…

【广州华锐互动】VR线上课件制作软件满足数字化教学需求

随着科技的不断发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术在教学领域的应用逐渐成为趋势。其中&#xff0c;广州华锐互动开发的VR线上课件制作软件更是备受关注。这种工具为教师提供了便捷的制作VR课件的手段&#xff0c;使得VR教学成为可能&#xff0c;极大地丰…