基于Austin 消息推送平台的设计模式学习

2024-06-18/2024-06-18

因为最近项目需要做一个消息推送功能,从 github 上找到了一个比较好的推送消息项目,看了下功能实现的很好,就拉下来看了看,发现其中的一些设计模式值得让人学习,就此记录下。

消息推送平台🔥 推送下发【邮件】【短信】【微信服务号】【微信小程序】【企业微信】【钉钉】等消息类型。

责任链

首先我们要知道发送一条信息的流程,如图(来自官网)image.png
可见每一条信息的发送是很复杂的。但使用责任链模式后,对于每一个处理器,仅需要关注自己是否可以处理该请求,然后将请求传递到下一个处理器,很好的做到了请求的发送者和接收者解耦。

在项目中的使用

首先我们需要了解责任链包含了什么角色

  • 抽象处理者(Handler):定义一个处理请求的接口,并持有下一个处理者的引用。
  • 具体处理者(Concrete Handler) :实现抽象处理者的接口,在处理请求前判断自己是否能够处理该请求,如果可以则进行处理,否则将请求传递给下一个处理者。

项目中定义了一个接口
image.png

其他处理器实现了该接口,此外定义了一个ProcessTemplate类,用来定义责任链执行顺序,注册为 bean 交给 spring 管理,并且因为项目中用到了多个责任链,这边模板用了map 来存储
image.png
image.png
那么当请求进来后,携带业务 code,则会找到相应的执行顺序,进入相应的责任链
image.png
定义完后,各个处理器中仅需要关注自身处理的逻辑。而不需要一层层的调用(有点像是)

扩展

实际上我们 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);
    }

进入该方法
image.png

该方法会把相应渠道 code 和处理器放入 map 中交给 spring 管理,
那么在调用时仅需要从 map 中取出处理器,调用 doHandler 方法即可


标题:基于Austin 消息推送平台的设计模式学习
作者:buguniao
地址:https://thunderdemon.cn/articles/2024/06/18/1718689447685.html

       
       
取消