策略模式与模板方法结合案例

一、背景

上周在迁移项目MQ工程的时候,重新Review代码,发现有一段代码综合使用了策略模式和模板方法,下面讲解一下具体场景应用的思路。

二、模板方法

策略模式前段时间有一个关于库存具体案例,详见 库存管理与策略模式。

模板方法:封装了一个固定流程,该流程由几个步骤完成,具体步骤由子类实现,从而让固定的流程产生不同的结果。它本质就是抽象封装流程,具体进行实现。

使用场景:程序主框架相同细节不同可以使用模板方法。

模板方法一个最常见的应用场景是在服务端架构中,一般定义before、process、after三个方法,before做一些参数验证,process主逻辑、after资源释放资源或其它非核心逻辑。

三、实际应用案例

在项目中,当配送单开始配送时需要给用户发送短信和微信通知消息告知用户快递单号,当订单完成或将小程序加入我的小程序时也需要给用户加积分,这里采用MQ进行解藕和异步化,具体见类图和下面的分析

1、MQ消息Tag对应一种业务事件类型,比如 订单支付、订单退款、配送单开始配送、配送单用户签收、将小程序添加到我的小程序、注册用户、分享海报等。

2、上述业务事件完成后都有可能会触发要给用户发送短信、发送微信通知消息、加积分。

3、模板方法:AbstractBaseHandler定义了模板方法,调用sendSms、sendWxMsg、addintegral抽象方法,封装了具体流程,具体子类去实现,如果不需要该功能就空实现。

4、策略模式:AbstractBaseHandler 可以认为是抽象策略接口,TagHandlerManager可以认为是环境上下文类。

代码流程:

1、SpringBoot应用启动时,具体的实现类会被注册到环境上下文 中,比如OrdPayFinishMsgHandler加载时会通过BaseHandler的init方法将它自己注册到TagHandlerManager

的ConcurrentHashMap中,Key和MQ中的Tag相同。

2、TopicVanMessageConsumerImpl接收到MQ消息后,根据Message中的Tag从TagHandlerManager中获取具体的实现类,然后通过接口方式调用process方法的具体实现。

3、如果有更多的业务事件类型,直接扩展Handler处理类,实现模板方法即可。

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

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

相关文章

修改npm全局安装的插件(下载目录指向)

我们先打开终端 然后执行 npm config get prefix查看npm 的下载地址 一般都会在C盘 但是 我们都知道 C盘下东西多了是很不好的 所以 我们可以执行 npm config set prefix “E:\npmfile”将 npm 的下载地址 改变成 E盘下的 npmfile目录 这样 以后 默认全局安装的插件就会都到…

中国34省区市三维地形图(直接保存)

吉林 ▼ 辽宁 ▼ 北京 ▼ 河北 ▼ 山东 ▼ 山西 ▼ 天津 ▼ 江苏 ▼ 福建 ▼ 上海 ▼ 台湾 ▼ 浙江 ▼ 广东 ▼ 广西 ▼ 海南 ▼ 香港和澳门 ▼ 安徽 ▼ 河南 ▼ 湖北 ▼ 湖南 ▼ 江西 ▼ 甘肃 ▼ 内蒙古 ▼ 宁夏 ▼ 青海 ▼ 陕西 ▼ 新疆 ▼ 贵州 …

016 Spring Boot + Vue 图书管理系统

Spring Boot Vue 图书馆管理系统(library-system) 本地快捷预览项目 第一步:运行 db 文件夹下的springboot-vue.sql(询问作者获取),创建springboot-vue数据库 第二步:修改后端数据库配置文件,启动后端 …

计算机网络-计算机网络体系结构-概述,模型

目录 一、计算机网络概述 二、性能指标 速率 带宽 吞吐量 时延 往返时延RTT 利用率 三、计算机网络体系结构 分层结构 IOS模型 应用层-> 表示层-> 会话层-> 传输层-> 网络层-> 数据链路层-> 物理层-> TCP/IP模型 一、计算机网络概述 计…

浅谈OV SSL 证书的优势

随着网络威胁日益增多,保护网站和用户安全已成为每个企业和组织的重要任务。在众多SSL证书类型中,OV(Organization Validation)证书以其独特的优势备受关注。让我们深入探究OV证书的优势所在,为网站安全搭建坚实的防线…

10-Node.js模块化

01.模块化简介 目标 了解模块化概念和好处,以及 CommonJS 标准语法导出和导入 讲解 在 Node.js 中每个文件都被当做是一个独立的模块,模块内定义的变量和函数都是独立作用域的,因为 Node.js 在执行模块代码时,将使用如下所示的…

Vue中如何进行图像处理与图像滤镜

在Vue中进行图像处理与图像滤镜 图像处理和滤镜效果是现代Web应用程序中常见的功能之一。Vue.js作为一个流行的JavaScript框架,为实现这些功能提供了许多工具和库。本文将介绍如何使用Vue来进行图像处理与图像滤镜,包括使用HTML5 Canvas和CSS滤镜。 准备…

抖音账号矩阵系统开发源码----技术研发

一、技术自研框架开发背景: 抖音账号矩阵系统是一种基于数据分析和管理的全新平台,能够帮助用户更好地管理、扩展和营销抖音账号。 抖音账号矩阵系统开发源码 部分源码分享: ic function indexAction() { //面包屑 $breadc…

WEB 3D 技术,通过node环境创建一个three案例

好 文章 前端3D Three.js 在本地搭建一个官方网站 中我们 搭建了一个Three的官网 现在呢 我们就来创建第一个ThreeJs的资源 这里呢 我们还是选择一个脚手架的开发模式 因为现在基本所有的前端都在使用这样的开发方式 这里 我们创建一个文件夹目录 作为我们项目的存放目录 我们…

boost在不同平台下的编译(win、arm)

首先下载boost源码 下载完成之后解压 前提需要自行安装gcc等工具 window ./bootstrap.sh ./b2 ./b2 installarm (linux) sudo ./bootstrap.sh sudo ./b2 cxxflags-fPIC cflags-fPIC linkstatic -a threadingmulti sudo ./b2 installx86 (linux) su…

第8期ThreadX视频教程:应用实战,将裸机工程移植到RTOS的任务划分,驱动和应用层交互,中断DMA,C库和中间件处理等注意事项

视频教程汇总帖:【学以致用,授人以渔】2023视频教程汇总,DSP第12期,ThreadX第8期,BSP驱动第26期,USB实战第5期,GUI实战第3期(2023-10-01) - STM32F429 - 硬汉嵌入式论坛 …

HD-G2UL-GW高性能4G工业网关|介绍|参数

HD-G2UL-GW多功能型网关基于高性能低功耗 ARM 处理器设计,集成 4G、2路网口、4 路 RS-485、2路 RS-232(与485有复用)、WIFI等功能,在电力、环保、节能、消防、农业等领域有广泛应用。 HD-G2UL-GW板载的外设功能: 集成2…

10-Node.js入门

01.什么是 Node.js 目标 什么是 Node.js,有什么用,为何能独立执行 JS 代码,演示安装和执行 JS 文件内代码 讲解 Node.js 是一个独立的 JavaScript 运行环境,能独立执行 JS 代码,因为这个特点,它可以用来…

虚拟环境搭建、后台项目创建及目录调整、封装logger、封装全局异常、封装Response、后台数据库创建

1 虚拟环境搭建 #1 虚拟环境作用多个项目,自己有自己的环境,装的模块属于自己的# 2 使用pycharm创建-一般放在项目路径下:venv文件夹-lib文件夹---》site-package--》虚拟环境装的模块,都会放在这里-scripts--》python&#xff0…

Arcgis日常天坑问题(1)——将Revit模型转为slpk数据卡住不前

这段时间碰到这么一个问题,revit模型在arcgis pro里导出slpk的时候,卡在98%一直不动,大约有两个小时。 首先想到的是revit模型过大,接近300M。然后各种减小模型测试,还是一样的问题,大概花了两天的时间&am…

如何选择合适的智能工单管理系统?智能工单系统有什么优势?

在当今社会,单位的运营和管理面临着越来越多的挑战。其中,设备的维护和保养是单位日常运营中的重要环节。然而,传统的工单管理方式存在着诸多问题,如报修效率低下、人工成本高昂、维修品质参差不齐等。为了解决这些问题&#xff0…

自动驾驶传感器技术

自动驾驶传感器技术是自动驾驶系统的关键组成部分,它使车辆能够感知并理解周围环境。本文将深入探讨自动驾驶传感器技术,包括常见类型、工作原理以及它们在自动驾驶中的作用。 1. 摄像头 摄像头的工作原理 摄像头是基于光学原理的传感器,其…

产品经理需要掌握哪些产品专业知识?

作为产品经理,最重要的是洞察客户的需求、理解客户的需求、掌握客户的需求,所以,第一件事情就是要有清晰的战略方向,我们到底梦想是什么?要做什么?能做什么?在哪儿做?谁负责去做&…

Stm32_标准库_7_光敏传感器

AO端口:通俗的讲大概是根据环境亮度的不同导致电阻的阻值不同,最后AO口输出的模拟量也不同,这个端口是用来测量环境光照的具体强度 DO端口:光敏电阻默认设置了一个阈值,当光照强度高于这个阈值本端口输出低电平&#…

IDEA的database工具以及对比两个数据库之间的差异(比DBVisualizer和DBeaver方便)

背景 其实IDEA里有个非常好用的database工具,用来连数据库,能连的数据非常多,最重要的是还带有对比数据库差异的工具。 唯一有点不好就是这个是 intellij idea的ultimate edition版本才有,对于社区版本(community ed…