优惠券平台(一):基于责任链模式创建优惠券模板

server/2025/2/11 10:39:19/

前景概要

系统的主要实现是优惠券的相关业务,所以对于用户管理的实现我们简单用拦截器在触发接口前创建一个单一用户。

// 用户属于非核心功能,这里先通过模拟的形式代替。后续如果需要后管展示,会重构该代码
UserInfoDTO userInfoDTO = new UserInfoDTO("1810518709471555585", 
"pdd45305558318", 
1810714735922956666L);
UserContext.setUser(userInfoDTO);

优惠券模板创建业务

优惠券分为平台券和店铺券,平台券由平台运营人员创建和管理员审批,关系隶属于平台,用户使用后成本一般来说由平台和商家共同承担;而店铺券由商家在商家后台直接创建,无需审核,成本由店家独自承担。

设定优惠券的领取规则,消耗规则:

// 领取规则
JSONObject receiveRule = new JSONObject();
receiveRule.put("limitPerPerson", 1); // 每人限领
receiveRule.put("usageInstructions", "xxx"); // 使用说明
// 消耗规则
JSONObject consumeRule = new JSONObject();
consumeRule.put("termsOfUse", new BigDecimal("10")); // 使用条件 满 x 元可用
consumeRule.put("maximumDiscountAmount", new BigDecimal("3")); // 最大优惠金额
consumeRule.put("explanationOfUnmetC 3onditions", "xxx"); // 不满足使用条件说明
consumeRule.put("validityPeriod", 48); // 自领取优惠券后有效时间,单位小时

责任链模式

现有代码的问题

  • 职责单一: 责任链模式可以将每个验证逻辑封装到一个独立的处理器中,每个处理器负责单一的验证职责,符合单一职责原则。

  • 可扩展性: 增加新的验证逻辑时,只需添加新的处理器,而不需要修改现有的代码。

  • 清晰的流程: 将所有验证逻辑组织在一起,使得代码结构更加清晰,易于理解。

什么是责任链模式

责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许将请求沿着一个处理链传递,直到链中的某个对象处理它。

核心部分代码:

@Component
public final class MerchantAdminChainContext<T> implements ApplicationContextAware, CommandLineRunner {private final Map<String, List<MerchantAdminAbstractChainHandler>> abstractChainHandlerContainer = new HashMap<>();
​/*** 责任链组件执行** @param mark         责任链组件标识* @param requestParam 请求参数*/public void handler(String mark, T requestParam) {// 根据 mark 标识从责任链容器中获取一组责任链实现 Bean 集合List<MerchantAdminAbstractChainHandler> abstractChainHandlers = abstractChainHandlerContainer.get(mark);if (CollectionUtils.isEmpty(abstractChainHandlers)) {throw new RuntimeException(String.format("[%s] Chain of Responsibility ID is undefined.", mark));}abstractChainHandlers.forEach(each -> each.handler(requestParam));}
​@Overridepublic void run(String... args) throws Exception {// 从 Spring IOC 容器中获取指定接口 Spring Bean 集合Map<String, MerchantAdminAbstractChainHandler> chainFilterMap = applicationContext.getBeansOfType(MerchantAdminAbstractChainHandler.class);chainFilterMap.forEach((beanName, bean) -> {// 判断 Mark 是否已经存在抽象责任链容器中,如果已经存在直接向集合新增;如果不存在,创建 Mark 和对应的集合List<MerchantAdminAbstractChainHandler> abstractChainHandlers = abstractChainHandlerContainer.getOrDefault(bean.mark(), new ArrayList<>());abstractChainHandlers.add(bean);abstractChainHandlerContainer.put(bean.mark(), abstractChainHandlers);});abstractChainHandlerContainer.forEach((mark, unsortedChainHandlers) -> {// 对每个 Mark 对应的责任链实现类集合进行排序,优先级小的在前unsortedChainHandlers.sort(Comparator.comparing(Ordered::getOrder));});}
​@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;}
}

逻辑流程图


http://www.ppmy.cn/server/166727.html

相关文章

【医院管理会计专题】2.管理会计:医院运营管理的隐形引擎

医院成本核算、绩效管理、运营统计、内部控制、管理会计专题索引 一、引言 在当今医疗行业竞争日益激烈、运营成本不断攀升的背景下,医院运营管理面临着前所未有的挑战。管理会计作为一种综合性的财务管理工具,在医院运营管理中扮演着举足轻重的角色。它不仅能够为医院管理…

Visual Studio 进行单元测试【入门】

摘要&#xff1a;在软件开发中&#xff0c;单元测试是一种重要的实践&#xff0c;通过验证代码的正确性&#xff0c;帮助开发者提高代码质量。本文将介绍如何在VisualStudio中进行单元测试&#xff0c;包括创建测试项目、编写测试代码、运行测试以及查看结果。 1. 什么是单元测…

iOS AES/CBC/CTR加解密以及AES-CMAC

感觉iOS自带的CryptoKit不好用&#xff0c;有个第三方库CryptoSwift还不错&#xff0c;好巧不巧&#xff0c;清理过Xcode缓存后死活下载不下来&#xff0c;当然也可以自己编译个Framework&#xff0c;但是偏偏不想用第三方库了&#xff0c;于是研究了一下&#xff0c;自带的Com…

Android 稳定性优化总结

对稳定性的理解 应用稳定性是最重要的性能指标之一&#xff0c;是APP质量构建体系中的基本盘&#xff0c;如果应用的稳定性出现问题&#xff0c;对产品、用户造成的伤害将是致命的。本文将从以下几个方面对应用稳定性优化进行整理。 需要说明&#xff0c;广义的稳定性不仅仅是…

【Java基础篇】——第4篇:Java常用类库与工具类

第4篇&#xff1a;Java常用类库与工具类 在Java开发中&#xff0c;使用常用的类库与工具类可以大大提高开发效率&#xff0c;减少重复代码的编写。Java标准库本身就包含了大量的常用工具类&#xff0c;除此之外&#xff0c;第三方库也为Java开发提供了丰富的功能。 1. Java标…

Vue.js 状态管理库Pinia

Pinia Pinia &#xff1a;Vue.js 状态管理库Pinia持久化插件-persist Pinia &#xff1a;Vue.js 状态管理库 Pinia 是 Vue 的专属状态管理库&#xff0c;它允许你跨组件或页面共享状态。 要使用Pinia &#xff0c;先要安装npm install pinia在main.js中导入Pinia 并使用 示例…

uniapp商城之购物车模块

文章目录 一、列表渲染二、删除单品1.封装删除API2.按钮绑定事件三、修改单品数量1.复用步进器组件2.属性和事件的绑定3.接口封装4.调用接口四、修改商品选中/全选1.单品选中绑定事件调用修改API2.计算全选状态3.绑定事件调用全选API并渲染单品选中状态五、底部结算信息1.计算选…

朝天椒USB服务器:解决加密狗远程连接

本文探讨朝天椒USB服务器用Usb Over Network技术&#xff0c;解决加密狗在虚拟机、云主机甚至异地的远程连接问题。 在企业数字化转型的浪潮中&#xff0c;加密狗作为防止软件盗版的重要手段&#xff0c;广泛应用于各类软件授权场景。然而&#xff0c;随着企业超融合进程不断加…