委托模式(Delegation Pattern):多渠道消息发送服务实战案例分析

1,145 阅读6分钟

image.png

在一个多渠道消息发送服务平台中,需要支持不同的消息发送渠道,例如短信、邮件、APP推送等。平台需要灵活地根据不同的消息类型和用户偏好选择合适的发送渠道,同时提出了代理与委托的区别和使用场景。

2. 为什么要使用委托设计模式

委托模式允许将消息发送的职责委托给专门的发送器对象,这样可以在不修改现有代码的情况下,增加新的消息发送渠道。

3. 标准委托设计模式图

4. 业务委托设计模式图

5. 业务代码参考

    // 消息类
    class Message {
        private String content;
        public Message(String content) {
            this.content = content;
        }
        public String getContent() {
            return content;
        }
    }

    // 消息发送委托接口
    interface MessageDelegate {
        void send(Message message);
    }

    // 短信发送器
    class SMSSender implements MessageDelegate {
        public void send(Message message) {
            // 实际的短信发送逻辑
            System.out.println("Sending SMS: " + message.getContent());
        }
    }

    // 邮件发送器
    class EmailSender implements MessageDelegate {
        public void send(Message message) {
            // 实际的邮件发送逻辑
            System.out.println("Sending Email: " + message.getContent());
        }
    }

    // APP推送发送器
    class AppPushSender implements MessageDelegate {
        public void send(Message message) {
            // 实际的APP推送发送逻辑
            System.out.println("Sending App Push: " + message.getContent());
        }
    }

    // 消息服务类
    class MessageService {
        private MessageDelegate messageDelegate;

        public void setMessageDelegate(MessageDelegate messageDelegate) {
            this.messageDelegate = messageDelegate;
        }

        public void sendMessage(Message message) {
            if (messageDelegate != null) {
                messageDelegate.send(message);
            } else {
                throw new IllegalStateException("Message delegate is not set");
            }
        }
    }

    // 客户端使用
    class MultiChannelMessagingPlatform {
        public static void main(String[] args) {
            MessageService messageService = new MessageService();
            Message message = new Message("Hello, this is a test message.");

            // 根据需要选择不同的发送器
            messageService.setMessageDelegate(new SMSSender());
            messageService.sendMessage(message);

            // 可以灵活切换到其他发送器
            messageService.setMessageDelegate(new EmailSender());
            messageService.sendMessage(message);
        }
    }

6. 使用委托设计模式的好处

  • 灵活性:可以灵活地切换消息发送渠道,满足不同场景和用户需求。
  • 扩展性:新增消息发送渠道时,无需修改消息服务类代码。

7. 其他使用委托设计模式场景参考

  • 支付处理:根据不同的支付方式委托不同的支付处理器。
  • 日志记录:根据不同的日志级别委托不同的日志记录器。

8. 可参考开源框架

  • Spring Framework:在Spring中,委托模式被用于实现方法的拦截和处理。

9. 委托模式(Delegation Pattern)和代理模式(Proxy Pattern) 区别

  1. 目的:
    • 委托模式:主要是为了实现职责链,即一个对象将其部分或全部职责转交给另一个对象,通常用于实现复杂的业务逻辑,如权限控制、数据访问等。简单来讲委托模式,委托同范围不同实现的内容。
    • 代理模式:主要是为了在不改变对象接口的前提下,为其他对象提供一种代理以控制对它的访问,如延迟初始化、访问控制、日志记录等。简单来讲代理通用的业务行为,业务范围可以不同
  2. 结构:
    • 委托模式:通常包含委托人和受托人两个角色。委托人将请求委托给受托人,受托人执行具体的操作。
    • 代理模式:包含代理对象和目标对象。代理对象在内部持有目标对象的引用,并在外部请求时对目标对象进行访问控制或额外处理。
  3. 使用场景:
    • 委托模式:适用于需要将请求的处理权从一个对象转移到另一个对象的场景,例如,在一个多层的软件架构中,上层组件将请求委托给下层组件处理。
    • 代理模式:适用于需要为另一个对象提供一个代替或公共额外的场景,以便在访问该对象时进行额外的操作,如访问前的权限检查或访问后的日志记录。
  4. 控制方式:
    • 委托模式:受托人直接执行委托的任务,委托人通常不涉及任务的具体执行逻辑。
    • 代理模式:代理对象控制对目标对象的访问,可以在访问前后添加额外的处理逻辑。
  5. 代理类型:
    • 远程代理:为远程对象提供代理,隐藏对象位于不同地址空间的事实。
    • 虚拟代理:延迟创建开销较大的对象。
    • 保护代理:控制对原始对象的访问。
    • 智能引用:在访问对象时执行额外操作,如引用计数。
  6. 实现方式:
    • 委托模式:通常通过组合关系实现,委托人持有受托人对象的引用,并调用其方法。
    • 代理模式:代理对象实现与目标对象相同的接口,客户端通过代理对象间接访问目标对象。

总结

委托模式通过将职责委托给专门的处理器,提高了代码的灵活性和可扩展性,使得系统能够适应多变的业务需求。

历史热点文章