统一短信发送接口多态的核心是面向接口编程:定义smssender接口约定send()和getchannelname(),各渠道实现类(如阿里云、腾讯云、mock等)封装特有逻辑;运行时通过工厂、spring注入或策略模式动态选择实现,新增渠道只需新增实现类并注册,符合开闭原则。

定义统一的短信发送接口
多态的核心是面向接口编程。先创建一个 SmsSender 接口,声明通用方法:
public interface SmsSender {
void send(String phoneNumber, String content);
String getChannelName(); // 用于区分渠道,便于日志或路由
}
这个接口不关心具体怎么发,只约定“能发、能标识渠道”。后续所有短信服务商(如阿里云、腾讯云、自建 HTTP 网关、甚至本地模拟)都实现它,就自然具备了可替换性。
为不同渠道编写具体实现类
每个渠道对应一个实现类,封装其特有逻辑和依赖。例如:
-
AliyunSmsSender:引入阿里云 SDK,构造时传入 AccessKey、签名、模板 ID;
send()内调用CommonRequest发送; -
TencentSmsSender:使用腾讯云
SmsClient,处理签名、模板参数、国际号码格式; - MockSmsSender:开发/测试用,只打印日志,不真实调用第三方;
- HttpBasedSmsSender:对接公司内部短信中台,通过 REST API + Token 认证发送。
它们都实现 SmsSender,但内部细节完全隔离——这就是多态带来的解耦。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
运行时动态选择发送渠道
不硬编码 new 某个实现类,而是通过策略决定用哪个实例。常见方式有:
-
简单工厂 + 参数路由:根据业务类型(如“注册验证码”“订单通知”)或配置项(如
spring.profiles.active=aliyun),返回对应 SmsSender 实例; -
Spring Bean 名称注入:用
@Qualifier("aliyunSmsSender")注入指定实现,适合配置驱动场景; - 策略模式组合:定义 SmsSendStrategy 接口,内部持有 SmsSender,再按优先级、失败降级(如主渠道失败自动切备用渠道)等逻辑封装调用流程。
关键点:调用方只持有 SmsSender 引用,完全不知道背后是哪家服务商。
扩展新渠道无需修改已有代码
要接入华为云短信?只需新增 HuaweiSmsSender 类,实现 SmsSender 接口,再在配置或工厂里注册它。原有发送逻辑、测试用例、监控埋点都不需要改动——符合开闭原则。
如果还需差异化行为(比如某些渠道要异步发、某些要加敏感词过滤),可在接口中增加默认方法,或引入模板方法模式,在抽象基类中统一预处理逻辑。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










