桥接模式的核心是分离抽象与实现两个独立变化维度并用组合连接。抽象层(如Notifier)封装“做什么”,只持MessageSender引用调用sendImpl;实现层(如SmsSender)专注“怎么做”,封装技术细节。新增策略或渠道只需扩展对应维度,类数量为N+M而非N×M,支持运行时动态绑定与解耦复用。

桥接模式的核心不是“把代码拆开”,而是识别出系统中真正独立变化的维度,再用组合关系把它们稳稳连在一起。它解决的是当抽象逻辑(比如“通知用户”)和实现细节(比如“用短信还是邮件发”)各自演化时,不互相拖累的问题。
抽象层封装“做什么”和“按什么规则做”
抽象类(如 Notifier)只关心业务意图:要不要重试、是否要延迟、是否记日志。它不写任何发送逻辑,只持有一个 MessageSender 类型的引用,并调用其 sendImpl() 方法。
子类如 UrgentNotifier 可以覆盖发送前后的检查逻辑,但不会碰到底层协议或连接管理。
- 新增一种通知策略(比如定时重发)?只需加一个新抽象子类,不动任何渠道代码
- 抽象层可以带状态、带配置、带生命周期管理,但它对“怎么发”一无所知
实现层专注“怎么把事情干成”
实现接口(如 MessageSender)只暴露极简契约:sendImpl(String content)。所有技术细节——HTTP调用、SMTP握手、模板渲染、签名加密——都封在具体实现里(SmsSender、EmailSender、PushSender)。
- 加一种新渠道?只要实现接口,立刻能被所有通知类型复用
- 实现类可单独单元测试,可替换为 Mock 或降级版本,不影响上层策略
运行时动态绑定才是桥接的价值所在
桥接不是靠继承树决定行为,而是在创建对象那一刻才组合。这种灵活性体现在:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- new UrgentNotifier(new SmsSender()) → 紧急短信
- new DelayedNotifier(new EmailSender()) → 延迟邮件
- 通过配置中心读取渠道名,用工厂返回对应实现:new NormalNotifier(senderFactory.get("wechat"))
两个维度扩展不再相互污染
传统继承下,“紧急+短信”“延迟+邮件”“普通+微信”每种组合都要一个新类,维度一增,类数爆炸。桥接后:
- 抽象维度加 N 个子类 → 总共 N 个类
- 实现维度加 M 个子类 → 总共 M 个类
- 组合能力是 N × M,但代码量只是 N + M
抽象与实现之间没有继承关系,只有强类型的组合引用。改通知策略,不影响渠道;换发送方式,不改业务规则。

















