全部学科
Python全栈
python
NodeJS全栈
nodejs
📅 2026-05-11 6 分钟 ✍️ juanwangdev

Java桥接模式

桥接模式将抽象部分与实现部分分离,使它们都可独立变化。

模式定义

意图:将抽象与实现解耦,两者可独立变化。

适用场景

  • 多维度变化的系统
  • 需要在运行时切换实现
  • 避免继承导致的类爆炸

模式结构

实现接口

Java
// 实现层接口
public interface DrawAPI {
    void drawCircle(int radius, int x, int y);
}

// 具体实现
public class RedDraw implements DrawAPI {
    @Override
    public void drawCircle(int radius, int x, int y) {
        System.out.println("绘制红色圆: r=" + radius + " x=" + x + " y=" + y);
    }
}

public class GreenDraw implements DrawAPI {
    @Override
    public void drawCircle(int radius, int x, int y) {
        System.out.println("绘制绿色圆: r=" + radius + " x=" + x + " y=" + y);
    }
}

抽象层

Java
// 抽象层
public abstract class Shape {
    protected DrawAPI drawAPI;  // 桥接点

    protected Shape(DrawAPI drawAPI) {
        this.drawAPI = drawAPI;
    }

    public abstract void draw();
}

// 扩展抽象
public class Circle extends Shape {
    private int radius;
    private int x;
    private int y;

    public Circle(int radius, int x, int y, DrawAPI drawAPI) {
        super(drawAPI);
        this.radius = radius;
        this.x = x;
        this.y = y;
    }

    @Override
    public void draw() {
        drawAPI.drawCircle(radius, x, y);
    }
}

使用示例

Java
// 红色圆
Shape redCircle = new Circle(10, 0, 0, new RedDraw());
redCircle.draw();  // 绘制红色圆

// 绿色圆
Shape greenCircle = new Circle(20, 5, 5, new GreenDraw());
greenCircle.draw();  // 绘制绿色圆

解决类爆炸问题

假设有2种形状(圆、矩形)和3种颜色(红、绿、蓝):

方式类数量
继承6个类(RedCircle, GreenCircle, BlueCircle...)
桥接5个类(2形状 + 3颜色 + 1抽象)

新增1种形状或1种颜色,继承需新增3个类,桥接只需新增1个类。

JDBC桥接模式

JDBC是桥接模式的经典应用:

Java
// 抽象:Java应用
// 实现:各种数据库驱动

// 抽象层不依赖具体数据库
Connection conn = DriverManager.getConnection(url);
Statement stmt = conn.createStatement();

// 切换数据库只需更换驱动
// MySQL → Oracle → PostgreSQL

实际应用示例

消息发送

Java
// 实现层:发送方式
public interface MessageSender {
    void send(String message);
}

public class EmailSender implements MessageSender {
    @Override
    public void send(String message) {
        System.out.println("邮件发送: " + message);
    }
}

public class SmsSender implements MessageSender {
    @Override
    public void send(String message) {
        System.out.println("短信发送: " + message);
    }
}

// 抽象层:消息类型
public abstract class Message {
    protected MessageSender sender;

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

    public abstract void send();
}

public class NormalMessage extends Message {
    private String content;

    public NormalMessage(String content, MessageSender sender) {
        super(sender);
        this.content = content;
    }

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

public class UrgentMessage extends Message {
    private String content;

    public UrgentMessage(String content, MessageSender sender) {
        super(sender);
        this.content = content;
    }

    @Override
    public void send() {
        sender.send("紧急消息: " + content);
    }
}

// 使用
Message msg1 = new NormalMessage("Hello", new EmailSender());
Message msg2 = new UrgentMessage("紧急", new SmsSender());
msg1.send();
msg2.send();

桥接 vs 适配器

模式目的关系
桥接分离变化维度设计阶段使用
适配器接口转换事后补救使用

适用场景

  1. 多维度变化的系统
  2. 需要在运行时切换实现
  3. 继承导致类数量爆炸
  4. 跨平台实现

注意事项

确认系统有多个独立变化维度

抽象层持有实现层引用(桥接点)

两个维度可独立扩展

桥接模式增加理解难度,应识别真正需要

要点总结

  1. 桥接模式分离抽象与实现,独立变化
  2. 抽象类持有实现接口引用
  3. 解决多维度变化导致的类爆炸
  4. JDBC是桥接模式的经典应用
  5. 设计阶段识别变化维度,提前使用
想在手机上练习这篇文章的配套题目?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码
← 上一篇 Java抽象工厂模式
下一篇 → Java模板方法模式
扫码体验小程序
加载中
想在手机上刷题学习?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码