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

news/2025/2/8 21:34:22 标签: 责任链模式

前景概要

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

// 用户属于非核心功能,这里先通过模拟的形式代替。后续如果需要后管展示,会重构该代码
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));
    }
​
    @Override
    public 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));
        });
    }
​
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
}

逻辑流程图


http://www.niftyadmin.cn/n/5845309.html

相关文章

leetcode_78子集

1. 题意 给定一个不含有重复数字的数列&#xff0c;求所有的子集。 2. 题解 子集型回溯&#xff0c;可以直接用dfs进行搜索&#xff1b;也可以用二进制来进行枚举。 2.1 选或不选 class Solution { public:void dfs(vector<vector<int>> &ans,vector<i…

日本游戏机市场5年来首次陷入萎缩;特斯拉招人推进人形机器人量产;任天堂专利显示Switch2手柄可用作鼠标...| 游戏智眼日报

美团成立“算法顾问委员会” 美团宣布&#xff0c;近日&#xff0c;由外部专家学者组成的算法顾问委员会成立&#xff0c;为美团改进算法提供常态化咨询和指导。每个季度美团将举办算法恳谈会&#xff0c;持续邀请骑手、商家、用户、专家学者和媒体代表等共同参加。美团表示&a…

flutter Selector 使用

在 Flutter 中&#xff0c;Selector 是 provider 包中的一个组件&#xff0c;用于在状态管理中高效地选择和监听特定部分的状态变化。Selector 可以帮助你避免不必要的重建&#xff0c;只在你关心的数据发生变化时才重建 widget。 基本用法 Selector 的基本用法如下&#xff…

pytest-xdist 进行多进程并发测试

在自动化测试中&#xff0c;运行时间过长往往是令人头疼的问题。你是否遇到过执行 Pytest 测试用例时&#xff0c;整个测试流程缓慢得让人抓狂&#xff1f;别担心&#xff0c;pytest-xdist 正是解决这一问题的利器&#xff01;它支持多进程并发执行&#xff0c;能够显著加快测试…

QUIC 与 UDP 关系

QUIC协议是建立在UDP之上的,这意味着QUIC的数据包实际上是通过UDP传输的。QUIC的设计使其能够利用UDP的特性,同时在其上实现更复杂的功能。以下是QUIC如何体现出其基于UDP的特性,以及QUIC头部字段的详细介绍。 QUIC与UDP的关系 UDP封装:QUIC数据包被封装在UDP数据包中进行…

实际时钟(RTC)的介绍

一、RTC介绍 RTC&#xff1a;实时时钟(Real-Time Clock)的缩写&#xff0c;是一种集成电路&#xff0c;通常称为时钟芯片。 应用&#xff1a;广泛应用于消费类电子产品&#xff0c;提供精确的实时时间或为电子系统提供时间基准。 工作原理&#xff1a;采用精度较高…

功能架构元模型

功能架构的元模型是对功能架构进行描述和建模的基础框架,它有助于统一不同团队对系统的理解,并为系统的设计和开发提供一致的标准和规范。虽然具体的元模型可能因不同的应用领域和特定需求而有所差异,但一般来说,功能架构的元模型可以涵盖以下几个方面: 组件/模块元模型:…

游戏引擎学习第90天

查看我们现在的进度 目标是完整地手写一个游戏&#xff0c;而不依赖任何现有的游戏引擎或库。这样做的主要原因是希望能够从头到尾掌握游戏开发的全部流程&#xff0c;确保对系统的每个部分都有清晰的理解。此外&#xff0c;现有的引擎和库往往存在各种设计上的问题&#xff0…