全部学科
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模板方法模式
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库