2.2 桥接模式
桥接模式(Bridge)处理一类典型的设计压力:一个东西同时沿着两个独立维度变化。 比如通知系统有“通知内容”(欢迎消息、付款收据、安全提醒)和“发送渠道”(邮件、短信、推送)两个维度;遥控器有“遥控器类型”和“被控设备”两个维度。
如果你用继承同时表达这两个维度,类的数量会以 M×N 爆炸:WelcomeEmail、WelcomeSms、ReceiptEmail、ReceiptSms…… 桥接的思路是:把两个维度拆成两套独立的体系,再用组合(一座“桥”)把它们连起来,于是新增通知内容或新增渠道时,不需要改遍所有组合。
下面的通知渠道桥接实验让你增加“通知内容”和“发送渠道”,直观看到揉在一起会产生多少组合类;打开桥接后,内容和发送器会分开维护。
正在加载交互实验...
抽象与实现,各自演化
桥接的术语里,两个维度有专门的名字:
- 抽象(Abstraction):面向客户端的高层部分,例如“遥控器”。
- 实现(Implementor):底层能力,例如“设备”。
java
abstract class Remote {
protected Device device; // 这就是“桥”:组合而非继承
Remote(Device device) { this.device = device; }
abstract void togglePower();
}
class BasicRemote extends Remote {
BasicRemote(Device d) { super(d); }
void togglePower() { device.setPower(!device.isOn()); }
}注意 Remote 持有一个 Device 引用——这一行就是“桥”。遥控器体系和设备体系可以各自新增子类,互不牵连。下面的实验让你任意搭配遥控器与设备并操作它们。
正在加载交互实验...
正在加载概念检查...
桥接 vs 适配器:意图不同
它们都用到组合,初学者容易混淆,但意图正好相反:
| 适配器 | 桥接 | |
|---|---|---|
| 时机 | 事后补救 | 事前设计 |
| 目的 | 让已有的不兼容接口协作 | 主动把抽象与实现分离 |
| 心态 | “它们本来配不上,我来缝” | “我预见到两个维度都会变,提前解耦” |
正在加载概念检查...
正在加载本节练习...