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

前言

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

 

对接苹果支付退款退单接口-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,一经查实,立即删除!

相关文章

sql之left join、right join、inner join的区别

sql之left join、right join、inner join的区别 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录 inner join(等值连接) 只返回两个表中联结字段相等的行 举例如下&#xff1…

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

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

【限时免费】20天拿下华为OD笔试之【前缀和】2023B-寻找连续区间【欧弟算法】全网注释最详细分类最全的华为OD真题题解

文章目录 题目描述与示例题目描述输入描述输出描述示例一输入输出说明 示例二输入输出 解题思路代码PythonJavaC时空复杂度 华为OD算法/大厂面试高频题算法练习冲刺训练 题目描述与示例 题目描述 给定一个含有N个正整数的数组&#xff0c;求出有多少个连续区间&#xff08;包…

【网络奇缘】- 计算机网络|分层结构|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…

执行shell脚本提示syntax error: unexpected end of file

具体报错如下&#xff1a; ./test.sh: line 36: syntax error: unexpected end of file执行命令时需将test.sh替换为实际的脚本文件名称。 情形一&#xff1a; shell脚本在Windows下编写&#xff0c;上传到Linux上执行&#xff0c;由于 fileformat 类型不同&#xff0c;所以报…

黑马点评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…

代码随想录算法训练营第三十二天| 122 买卖股票的最佳时机 || 55 跳跃游戏 45 跳跃游戏 ||

目录 122 买卖股票的最佳时机 || 55 跳跃游戏 45 跳跃游戏 || 122 买卖股票的最佳时机 || 设置变量now代表此时买入的股票&#xff0c;为赋值为Integer.MAX_VALUE&#xff0c;遍历prices数组&#xff0c;有如下两种情况&#xff1a; 如果比now小说明不能售出&#xff0c;可以…

关于unicloud云对象或云函数获取时间不对的问题

话不多说&#xff0c;直接上代码&#xff1a; function timeWeekFormat() { //定义一个日期对象; var dateTime getOffsetDate(8); //获得系统年份; var year dateTime.getFullYear(); //获得系统月份; var month dateTime.getMonth() 1; //获…

栈和队列的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打交道&…

【NGINX--5】身份验证

1、HTTP 基本身份验证 需要通过 HTTP 基本身份验证保护应用或内容。 生成以下格式的文件&#xff0c;其中的密码使用某个受支持的格式进行了加密或哈希处理&#xff1a; # comment name1:password1 name2:password2:comment name3:password3第一个字段是用户名&#xff0…

紫光展锐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…

优橙内推青海专场——5G网络优化(中高级)工程师

可加入就业QQ群&#xff1a;801549240 联系老师内推简历投递邮箱&#xff1a;hrictyc.com 内推公司1&#xff1a;浙江明讯网络技术有限公司 内推公司2&#xff1a;南京华苏科技有限公司 内推公司3&#xff1a;杭州华星创业通信技术有限公司 浙江明讯网络技术有限公司 浙江明…

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

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

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

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