核心是用接口定义统一行为、泛型集合存储实现、运行时自动分发调用:定义MessageSender接口约定send()方法,参数为NoticeMessage、返回SendResult;各通道如EmailSenderImpl、SmsSenderImpl等实现该接口并封装厂商细节;通过List<MessageSender>持有实例,循环调用实现动态扩展与解耦。

核心是用接口定义统一行为,用泛型集合存储不同实现,运行时自动分发调用。
定义统一的消息通道接口
所有推送方式(短信、邮件、微信、钉钉等)必须实现同一个接口,声明共同方法,比如send(Message msg)。这个接口就是行为契约,不关心内部怎么发,只约定“能发”。
- 接口方法参数建议用通用消息对象(如NoticeMessage),包含type、receiver、content、templateId等字段
- 返回类型统一为SendResult,封装成功状态、错误码、原始响应等,便于上层统一处理
- 避免在接口里暴露厂商细节(如阿里云的SignName、腾讯云的SmsSdkAppId),这些应封装在具体实现类内部
各通道实现类各自专注自身逻辑
每个具体推送方式写一个实现类,只负责把通用消息转成对应协议要求的格式并调用SDK或HTTP接口。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- EmailSenderImpl:使用Spring Boot的JavaMailSender,处理HTML、附件、SMTP配置
- SmsSenderImpl:对接云厂商API,完成签名计算、模板参数填充、HTTP POST、响应解析
- WechatSenderImpl:调用微信公众号模板消息接口,管理access_token缓存与刷新
- 所有实现类都只依赖接口,彼此隔离,互不影响
用泛型集合统一持有并调度
声明集合类型为List
立即学习“Java免费学习笔记(深入)”;
- 添加时:senders.add(new EmailSenderImpl()); senders.add(new SmsSenderImpl()); —— 编译通过,类型安全
- 调用时:for (MessageSender sender : senders) { sender.send(msg); } —— JVM自动绑定到实际类型的方法
- 新增通道(如企业微信)只需加一个新实现类,注册进集合,原有循环代码完全不动
配合策略模式动态选择通道
业务层不需要知道该用哪个发送器,由工厂或策略上下文根据消息类型自动匹配。
- 可基于msg.getNoticeMethod()(如EMAIL、SMS、WECHAT)查Map获取对应sender
- 也可用Spring的@Qualifier配合枚举注入,或自定义MessageSenderFactory
- 这样业务代码只写senderFactory.getSender(msg.getType()).send(msg),彻底解耦

















