自学教程 学编程从这里开始

桥接模式

《桥接模式》|设计模式系列第08篇

系列:结构型模式 · 桥接模式(Bridge Pattern)
关键词:维度分离、抽象与实现解耦、组合代替继承、多维度扩展

一、什么是桥接模式

桥接模式(Bridge Pattern):将抽象部分与实现部分分离,使它们都可以独立地变化。

属于结构型设计模式。

简单理解:
当一个类存在两个或多个独立变化的维度时,不要使用继承来扩展,改用组合搭建一座“桥”,把抽象层和实现层连接起来。继承是静态绑定,桥接是动态组合,两个维度可以各自独立扩展,互不影响。

核心意图
避免多层继承带来的类爆炸;把多维度变化拆分成两套独立体系,通过组合关联。

适用场景

  1. 类有多个变化维度,维度都需要扩展
  2. 不想使用继承,或者继承会导致类数量急剧膨胀
  3. 需要在运行时动态切换实现层
  4. 抽象和实现需要独立扩展迭代

⚠️ 缺点预警:增加系统抽象层次,提高理解难度;需要识别出系统中独立变化的维度,识别难度较高。

二、UML结构图

角色划分:

  1. Abstraction(抽象类):定义抽象接口,持有实现层对象引用(桥)
  2. RefinedAbstraction(扩充抽象类):扩展抽象类,新增抽象层能力
  3. Implementor(实现接口):定义实现层基础接口,不需要完整实现
  4. ConcreteImplementor(具体实现类):实现Implementor接口,提供具体逻辑

三、Java 完整示例

场景:消息推送系统。
变化维度1:消息类型(普通消息、紧急消息)【抽象层】
变化维度2:发送渠道(短信、邮件)【实现层】

如果用继承:普通短信、普通邮件、紧急短信、紧急邮件,类数量随维度乘积增长。
桥接模式拆分两个维度,使用组合关联。

1. 实现层接口 Implementor

// 发送渠道接口(实现层)
public interface MessageSender {
    void send(String content);
}

2. 具体实现类 ConcreteImplementor

// 短信发送
public class SmsSender implements MessageSender {
    @Override
    public void send(String content) {
        System.out.println("【短信】发送消息:" + content);
    }
}

// 邮件发送
public class EmailSender implements MessageSender {
    @Override
    public void send(String content) {
        System.out.println("【邮件】发送消息:" + content);
    }
}

3. 抽象类 Abstraction

// 消息抽象类(抽象层),持有发送渠道引用,作为桥
public abstract class Message {
    protected MessageSender sender;

    public Message(MessageSender sender) {
        this.sender = sender;
    }

    public abstract void sendMessage(String content);
}

4. 扩充抽象类 RefinedAbstraction

// 普通消息
public class NormalMessage extends Message {
    public NormalMessage(MessageSender sender) {
        super(sender);
    }

    @Override
    public void sendMessage(String content) {
        sender.send("普通消息:" + content);
    }
}

// 紧急消息
public class UrgentMessage extends Message {
    public UrgentMessage(MessageSender sender) {
        super(sender);
    }

    @Override
    public void sendMessage(String content) {
        sender.send("【紧急】" + content);
    }
}

5. 客户端调用

public class Client {
    public static void main(String[] args) {
        // 普通消息,短信渠道
        Message normalSms = new NormalMessage(new SmsSender());
        normalSms.sendMessage("订单已发货");

        // 紧急消息,邮件渠道
        Message urgentEmail = new UrgentMessage(new EmailSender());
        urgentEmail.sendMessage("账户异常,请尽快处理");
    }
}

新增渠道:只新增 MessageSender;新增消息类型:只新增 Message 子类,两个维度独立扩展。

四、优缺点总结

✅ 优点

  1. 分离抽象与实现,二者独立扩展,互不干扰
  2. 解决多维度继承导致的类爆炸,遵循合成复用原则
  3. 运行时动态切换实现对象,灵活性高
  4. 抽象层和实现层解耦

❌ 缺点

  1. 需要识别独立变化维度,设计门槛高
  2. 增加抽象层次,提升代码理解成本

五、桥接模式 vs 适配器模式

模式目的核心
桥接模式事前设计,分离两个变化维度搭建桥梁,两个体系独立扩展
适配器模式事后兼容,转换已有不兼容接口包装适配,解决接口不匹配

六、框架源码应用

  • JDBC Driver:Driver 作为实现层,Connection 抽象层,桥接不同数据库驱动
  • Spring MessageSource
  • AWT 中绘制组件(Component + Graphics)经典桥接案例

七、小结

桥接模式核心:识别两个独立变化维度,用组合代替继承,抽象和实现分离。
判断是否适合桥接:当发现类沿着多个维度变化,并且维度未来都需要扩展,优先考虑桥接。

标签:

0 条笔记