基于Austin 消息推送平台的设计模式学习
因为最近项目需要做一个消息推送功能,从 github 上找到了一个比较好的推送消息项目,看了下功能实现的很好,就拉下来看了看,发现其中的一些设计模式值得让人学习,就此记录下。
责任链
首先我们要知道发送一条信息的流程,如图(来自官网)
可见每一条信息的发送是很复杂的。但使用责任链模式后,对于每一个处理器,仅需要关注自己是否可以处理该请求,然后将请求传递到下一个处理器,很好的做到了请求的发送者和接收者解耦。
在项目中的使用
首先我们需要了解责任链包含了什么角色
- 抽象处理者(Handler):定义一个处理请求的接口,并持有下一个处理者的引用。
- 具体处理者(Concrete Handler) :实现抽象处理者的接口,在处理请求前判断自己是否能够处理该请求,如果可以则进行处理,否则将请求传递给下一个处理者。
项目中定义了一个接口

其他处理器实现了该接口,此外定义了一个ProcessTemplate类,用来定义责任链执行顺序,注册为 bean 交给 spring 管理,并且因为项目中用到了多个责任链,这边模板用了map 来存储


那么当请求进来后,携带业务 code,则会找到相应的执行顺序,进入相应的责任链

定义完后,各个处理器中仅需要关注自身处理的逻辑。而不需要一层层的调用(有点像是)
扩展
实际上我们 web 项目的拦截器就用到了责任链模式,在请求到达处理器前,需要做进行一些额外的处理,例如身份验证、日志记录、权限控制等。拦截器就是利用了责任链模式来将多个处理对象构成一条拦截器链,然后逐个处理请求。
策略模式和工厂方法
对于一个消息推送平台,会存在很多发送方式,例如钉钉的工作通知,飞书,短信等,使用策略模式可以很好的避免循环判断,增加代码程序拓展和移植,增加代码复用和业务逻辑分离和优化。
首先定义了一个接口,定义了一个处理方法,
public interface Handler {
/**
* 处理器
*
* @param taskInfo
*/
void doHandler(TaskInfo taskInfo);
}
然后定义了一个抽象类,实现该方法且定义了一个抽象方法
/**
* 统一处理的handler接口
*
* @param taskInfo
* @return
*/
public abstract boolean handler(TaskInfo taskInfo);
使各个发送消息处理器实现该方法
例如钉钉工作通知
@Override
public boolean handler(TaskInfo taskInfo) {
……(略)
}
那么我们在调用 send 方法时是如何找到对应的处理器呢?
austin 在发送任务信息中定义了一个发送渠道 id,在初始化BasHandler后会调用
/**
* 初始化渠道与Handler的映射关系
*/
@PostConstruct
private void init() {
handlerHolder.putHandler(channelCode, this);
}
进入该方法

该方法会把相应渠道 code 和处理器放入 map 中交给 spring 管理,
那么在调用时仅需要从 map 中取出处理器,调用 doHandler 方法即可
标题:基于Austin 消息推送平台的设计模式学习
作者:buguniao
地址:https://thunderdemon.cn/articles/2024/06/18/1718689447685.html