设计模式-桥接模式(Bridge Pattern)

设计模式-桥接模式(Bridge Pattern)

  概要

  记忆关键词:抽象和实现分离

  定义:将抽象部分与它的实现部分分离,使它们都可以独立变化。

  分析:一个类存在两个(或多个)独立变化的维度,我们通过组合的方式,让这两个(或多个)维度可以独立进行扩展。

  类型:结构型

  桥接模式结构图如下

img

 

    一、涉及相关角色

   1.  抽象部分

   系统对外提供的高层接口,代表抽象的业务维度。

   说明:在下面示例中,形状(Shape)是抽象部分,它定义了一个绘制形状的接口,比如 draw() 方法,但不关心具体颜色如何实现。

   2. 扩充抽象部分

   在抽象部分的基础上,增加额外的功能或具体行为。

   说明:在下面示例中,圆形(Circle)、正方形(Square)等具体形状类,它们在 draw() 方法中调用颜色的实现。

   3.  实现部分

   描述抽象部分所依赖的操作接口,是另一个独立变化的维度。被抽象部分组合,完成具体实现。抽象部分通过该接口与实现部分解耦,而不是依赖具体实现。

   说明:在下面示例中,颜色(Color)就是实现部分,比如红色、蓝色,它只定义颜色的行为接口

   4.  具体实现部分

   实现部分接口的具体类,完成实际的业务逻辑。

   说明:在下面示例中颜色(Color)具体实现类有白色、灰色、黑色,它们都实现了颜色接口,完成实际业务逻辑。

   二、示例代码

    1. 实现部分

 1 public interface Color {
 2     void paint(String shape);
 3 }
 4 public class Black implements Color {
 5     @Override
 6     public void paint(String shape) {
 7         System.out.println("黑色的" + shape);
 8     }
 9 }
10 public class White implements Color {
11     @Override
12     public void paint(String shape) {
13         System.out.println("白色的" + shape);
14     }
15 }
16 public class Gray implements Color {
17     @Override
18     public void paint(String shape) {
19         System.out.println("灰色的" + shape);
20     }
21 }

    2. 抽象部分

public abstract class Shape {
    Color color; // 桥接到实现部分

    public void setColor(Color color) {
        this.color = color;
    }

    public abstract void draw();
}

public class Rectangle extends Shape{
    @Override
    public void draw() {
        color.paint("长方形");
    }
}

public class Square extends Shape {
    @Override
    public void draw() {
      color.paint("正方形");
    }
}

public class Circle extends Shape{
    @Override
    public void draw() {
        color.paint("圆形");
    }
}

   三、优缺点分析
    1.  优点

  • 抽象与实现分离:将抽象部分和实现部分分离,减少它们之间的耦合,使系统更灵活。
  • 提高系统扩展性:抽象和实现可以沿着不同的维度独立扩展,不会相互影响。
  • 符合开闭原则:新增抽象类或实现类时无需修改现有代码,扩展更容易。
  • 运行时动态组合:抽象和实现可以在运行时动态绑定,而不是编译期固定。
  • 减少子类数量:相比多维度继承的方式,桥接模式用组合替代继承,避免类爆炸。

    2.  缺点

  • 增加系统复杂度:引入桥接层,增加了类的数量和代码复杂度,对初学者理解不直观。
  • 设计难度较高: 需要在系统设计阶段明确抽象维度,提前规划,否则后续改造成本大。
  • 过度设计风险如果系统只有一个维度变化,使用桥接模式会显得多此一举。

    四、适用场景

   JDBC 驱动是桥接模式的经典应用。如果我们想要把 MySQL 数据库切换成 Oracle 数据库,只需要更换数据库驱动,动一行代码就可以实现了

   支付系统 → 支付方式(实现部分) + 支付渠道(抽象部分)

   日志系统 → 日志级别(抽象部分) + 输出方式(实现部分)

 

posted @ 2025-08-26 09:01  欢乐豆123  阅读(25)  评论(0)    收藏  举报