返回

巧用策略模式,实现消息转发的艺术

后端

背景

在上一篇文章中,我们介绍了如何设计一个消息中心,传送门 👉《如何设计一个消息中心》。有了承载这些消息的地方后,接下来的问题便是,这些消息从哪里来?

通常对于一个内容型产品来说,在其互动体系中,为用户提供消息提醒是一个刚需。比如用户关注的内容更新了,用户参与的活动开始了,或者系统需要向用户发送一些重要的通知。

那么,这些消息是如何发送到消息中心的呢?

消息转发的基本思路

消息转发的基本思路是,当需要发送消息时,系统会将消息的内容、接收人等信息封装成一个消息对象,然后将消息对象交给消息中心。消息中心会根据消息对象的接收人信息,将消息转发到相应的接收端。

消息转发的挑战

消息转发看似简单,但实际落地时会面临一些挑战。

  • 消息来源多样 :消息可以来自不同的来源,比如用户行为、系统事件、定时任务等。
  • 消息类型复杂 :消息可以是文本消息、图片消息、视频消息、语音消息等。
  • 消息接收端分散 :消息可以发送到不同的接收端,比如手机、邮箱、微信、短信等。

策略模式的应用

策略模式可以帮助我们应对消息转发面临的挑战。策略模式的思想是,将消息转发的具体实现与消息转发策略分离。消息转发策略决定了消息如何转发,而消息转发具体实现负责执行消息转发策略。

这样一来,当我们需要增加新的消息来源、新的消息类型或新的消息接收端时,只需要实现相应的策略即可,而不需要修改消息转发具体实现。这使得消息转发系统更加灵活、可扩展和易于维护。

示例

下面我们通过一个示例来说明策略模式在消息转发场景下的应用。

假设我们有一个消息中心,可以将消息转发到手机、邮箱和微信。当需要发送消息时,系统会将消息的内容、接收人等信息封装成一个消息对象,然后将消息对象交给消息中心。

消息中心会根据消息对象的接收人信息,将消息转发到相应的接收端。为了实现这一点,消息中心需要使用策略模式。

消息中心可以定义一个IMessageForwardingStrategy接口,该接口定义了消息转发的基本方法。例如:

public interface IMessageForwardingStrategy {
    void forwardMessage(Message message);
}

消息中心可以为每种消息接收端实现一个IMessageForwardingStrategy接口的实现类。例如:

public class MobileMessageForwardingStrategy implements IMessageForwardingStrategy {
    @Override
    public void forwardMessage(Message message) {
        // 将消息转发到手机
    }
}

public class EmailMessageForwardingStrategy implements IMessageForwardingStrategy {
    @Override
    public void forwardMessage(Message message) {
        // 将消息转发到邮箱
    }
}

public class WeChatMessageForwardingStrategy implements IMessageForwardingStrategy {
    @Override
    public void forwardMessage(Message message) {
        // 将消息转发到微信
    }
}

当消息中心需要将消息转发到某个接收端时,它会根据接收端的信息选择相应的策略。例如,如果接收端是手机,则消息中心会选择MobileMessageForwardingStrategy策略。

策略模式使得消息中心可以灵活地支持不同的消息接收端。当需要增加新的消息接收端时,只需要实现一个新的IMessageForwardingStrategy接口的实现类即可。

优点

使用策略模式来实现消息转发具有以下优点:

  • 灵活 :策略模式使得消息转发系统可以灵活地支持不同的消息来源、消息类型和消息接收端。
  • 可扩展 :策略模式使得消息转发系统易于扩展。当需要增加新的消息来源、消息类型或消息接收端时,只需要实现相应的策略即可。
  • 易于维护 :策略模式使得消息转发系统易于维护。当需要修改消息转发的逻辑时,只需要修改相应的策略即可。
  • 性能 :策略模式可以提高消息转发的性能。因为策略模式将消息转发的具体实现与消息转发策略分离,因此消息转发具体实现可以并行执行。

结语

策略模式是一种非常有用的设计模式,它可以帮助我们设计出灵活、可扩展且易于维护的系统。在消息转发场景中,策略模式可以帮助我们轻松应对消息来源多样、消息类型复杂、消息接收端分散的挑战。

如果您正在设计一个消息转发系统,那么强烈建议您使用策略模式。策略模式可以帮助您轻松实现消息转发的需求,并提高系统