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

一、背景

上周在迁移项目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处理类,实现模板方法即可。

相关推荐
熊出没5 小时前
解锁策略模式:Java 实战与应用全景解析
策略模式
黑不溜秋的13 小时前
C++ 设计模式 - 策略模式
c++·设计模式·策略模式
ox00802 天前
C++ 设计模式-策略模式
c++·设计模式·策略模式
Hadesls4 天前
MacOS 15.3 卸载系统内置软件
macos·策略模式
Tang Paofan10 天前
【C++】策略模式
开发语言·c++·策略模式
bug的abc11 天前
策略模式-小结
策略模式
谢道韫66611 天前
从0到1:ArkTS实现鸿蒙策略模式全解析
华为·harmonyos·策略模式
geekmice12 天前
问题:通过策略模式+工厂模式+模板方法模式实现ifelse优化
策略模式·模板方法模式
添砖Java中12 天前
深度解析策略模式:从理论到企业级实战应用
spring boot·spring·spring cloud·设计模式·maven·策略模式
weixin_4383354012 天前
设计模式之策略模式
设计模式·策略模式