软件设计不是CRUD(16):低耦合模块设计理论——行为抽象与设计模式(下)

(接上文《软件设计不是CRUD(15):低耦合模块设计理论——行为抽象与设计模式(中)》)

3.2.4、之前的业务逻辑需要关注后续逻辑的执行成败,并调整自身执行的情况

这个场景在之前场景的基础上增加了新的控制要求,具体来说就是之前已经完成的控制逻辑执行,需要在后续控制逻辑执行出现问题时,获得一种错误补偿的方式。这和我们常说的数据库事务还有所区别(当然数据库事务回滚也是必要的一种错误补偿方式),因为错误补偿不一定是数据库事务回滚。

这实际上也是在之前介绍的单个业务控制点的基础上,对一个业务维度的多个实现进行错误补偿控制方式的一种扩充。只不过这里需要解决的是一个控制逻辑上,多个业务控制点之间如何协进行调错误补偿的问题。这里推荐一种命令模式的设计方式,如下图所示:

在这里插入图片描述
为什么这里需要将具体结算单的策略传入到命令中,这是因为不可能为某一种具体的结算单创建一种对应的命令,例如不可能为SettlementA这种类型的结算单创建专门的一种转换命令,然后再为SettlementB这种类型的结算单创建专门的一种转换命令,否则可能会导致类爆炸(类爆炸的概念在前文中介绍过,这里不再赘述,导致类爆炸的原因主要是因为维度合并,且设计无法控制维度扩展)。

  • 这是命令接口的定义
// 结算单执行命令
public interface SettlementCommand {// 命令执行方法public void doCommand();// 用于在控制逻辑出现错误的情况下// 要求具体命令的业务执行过程进行错误补偿public void redo(Throwable e);
}
  • 对结算单信息进行验证的命令
// 对结算单信息进行验证的命令
public class ValidateSettlementCommand implements SettlementCommand {private SettlementStrategy<Settlement> settlementStrategy;private Settlement settlement;// =======// 这里有一个构造方法,为了节约篇幅省去// =======@Overridepublic void doCommand() {if(this.settlementStrategy.needValidate(settlement)) {this.settlementStrategy.validate(settlement);}}@Overridepublic void redo() {// 该验证命令在整个控制逻辑出现问题时,不用做对应的错误补偿}
}
  • 对结算单信息进行信息转换的命令
// 对结算单信息进行信息转换的命令
public class BalanceSettlementCommand implements SettlementCommand {private SettlementStrategy<Settlement> settlementStrategy;private BalanceStrategy balanceStrategy;private Settlement settlement;// =======// 这里有一个构造方法,为了节约篇幅省去// =======@Overridepublic void doCommand() {this.settlementStrategy.balance(settlement, balanceStrategy);}@Overridepublic void redo() {// 当整个控制逻辑发生错误时,该命令需求重置已设定的结算费用,并清理数据库中的设定信息}
}
  • 发送事件通知的命令
// 发送事件通知的命令
@Slf4j
public class SendEventSettlementCommand implements SettlementCommand {private Settlement settlement;@Autowired(required = false)private List<SettlementEventListener> settlementEventListeners;public SendEventSettlementCommand(Settlement settlement) {this.settlement = settlement;}@Overridepublic void doCommand() {if(CollectionUtils.isEmpty(this.settlementEventListeners)) {return;}// 对上层模块进行事件通知for (SettlementEventListener settlementEventListener : settlementEventListeners) {try {settlementEventListener.onBalanced(settlement);} catch(RuntimeException e) {log.error(e.getMessage() , e);}}}@Overridepublic void redo() {

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

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

相关文章

pdf在浏览器上无法正常加载的问题

一、背景 觉得很有意思给大家分享一下。事情是这样的&#xff0c;开发给我反馈说&#xff0c;线上环境接口请求展示pdf异常&#xff0c;此时碰巧我前不久正好在ingress前加了一层nginx&#xff0c;恰逢此时内心五谷杂陈&#xff0c;思路第一时间便放在了改动项。捣鼓了好久无果…

继承 | Java

继承概念 继承&#xff1a;就是子类继承父类的属性和行为&#xff0c;使得子类对象具有与父类相同的属性、相同的行为。子类可以直接访问父类中的非私有的属性和行为。 定义父类&#xff1a; package com.yh;public class Animal {String color;String brand;int age 5;priva…

农村集中式生活污水分质处理及循环利用技术指南

立项单位&#xff1a;生态环境部土壤与农业农村生态环境监管技术中心、山东文远环保科技股份有限公司、北京易境创联环保有限公司、中国环境科学研究院、广东省环境科学研究院、中铁第五勘察设计院集团有限公司、中华环保联合会水环境治理专业委员会 本文件规定了集中式村镇生活…

实现Flutter应用中的全局导航栏效果

介绍 在移动应用开发中&#xff0c;导航栏是用户与应用交互的重要组成部分之一。它不仅提供了应用程序中不同页面之间的导航功能&#xff0c;还可以展示应用的整体结构和主要功能。因此&#xff0c;设计一个清晰、易用的导航栏对于提升用户体验和应用的可用性至关重要。 在Fl…

【系统架构师】-第15章-面向服务架构设计

面向服务的体系结构 (Service-Oriented Architecture,SOA) 1、应用角度&#xff1a;它着眼于日常的业务应用&#xff0c;并将它们划分为单独的业务功能和流程&#xff0c;即所谓的服务 2、软件基本原理&#xff1a;一个组件模型&#xff0c;它将应用程序的不同功能单元(称为服…

钉钉服务端API报错 43008 参数需要multipart类型

钉钉服务端API报错 43008 参数需要multipart类型 problem 使用媒体文件上传接口&#xff0c;按照文档输入参数&#xff0c;结果返回报错 # 参数 {"access_token": "xxx""type": "image","media": "/Users/xxx/xxx/s…

Vscode 常用插件和快捷键 2024版笔记

1. 常用插件2.常用快捷键 1. 常用插件 1.1 Chinese vscode 转成中文&#xff08;更新版后有进要重装&#xff09; 1.2 Live Server 浏览成网页 1.3 Material Icon Theme 文件目录和文件图标样式&#xff08;没有自定义&#xff09; 1.4 vscode 主题 1.5 代码截图 1.6 代码补…

桌面/WEB端3D开发工具HOOPS SDK简介

Tech Soft 3D在长达25年的时间内&#xff0c;一直通过卓越的3D技术帮助全球超过600家客户推动创新&#xff0c;这些客户包括HEXAGON、SolidWorks、SIEMENS、Aras、ANSYS、AVEVA等各个行业的领军者。 Tech Soft 3D旗下拥有4款原生产品&#xff0c;分别是&#xff1a;HOOPS Excha…

虚拟现实(VR)项目的开发工具

虚拟现实&#xff08;VR&#xff09;项目的开发涉及到多种工具&#xff0c;这些工具可以帮助开发者从建模、编程到最终内容的发布。以下是一些被广泛认可的VR开发工具&#xff0c;它们覆盖了从3D建模到交互设计等多个方面。北京木奇移动技术有限公司&#xff0c;专业的软件外包…

机器视觉学习(十)—— 轮廓检测

目录 一、轮廓的检测与绘制 1.1 cv2.findContours()函数 1.2 cv2.drawContours()函数 1.3 轮廓检测示例代码 二、显示边界框 2.1 cv2.boundingRect()函数 2.2 cv2.rectangle()函数 2.3 显示绘制边界框 2.4 个人笔记和进阶版显示边框 2.4.1 个人笔记 2.4.2 进阶版显示…

GT收发器第五篇_TXUSRCLK和TXUSRCLK2

文章目录 概述&#xff1a;一、TXUSRCLK和TXUSRCLK2作用和关系总结 二、TXUSRCLK和TXUSRCLK2产生1、TXOUTCLK在2字节或4字节模式下驱动GTX/GTH收发器TX2、TXOUTCLK 在 4 字节或 8 字节模式下驱动 GTX/GTH 收发器 TX 总结&#xff1a; 概述&#xff1a; 功能描述&#xff1a; F…

[机器学习]练习-KNN算法

1&#xff0e;&#x1d458;近邻法是基本且简单的分类与回归方法。&#x1d458;近邻法的基本做法是&#xff1a;对给定的训练实例点和输入实例点&#xff0c;首先确定输入实例点的&#x1d458;个最近邻训练实例点&#xff0c;然后利用这&#x1d458;个训练实例点的类的多数来…