CHARLIE SAYS

查理如是说
DATE 2026-08-24
THEME
SERIES / DESIGN_PATTERNS / P-104 · 设计模式

设计模式 010:桥接(Bridge)

意图

将抽象与实现分离开来,使它们可以独立变化

类图

  • Abstraction:定义抽象类的接口
  • Implementor:定义实现类接口
classDiagram
    class RemoteControl {
        <<abstract>>
        #tv TV
        +on()* void
        +off()* void
        +tuneChannel()* void
    }
    class ConcreteRemoteControl1
    class ConcreteRemoteControl2
    class TV {
        <<abstract>>
        +on()* void
        +off()* void
        +tuneChannel()* void
    }
    class Sony
    class RCA
    RemoteControl <|-- ConcreteRemoteControl1
    RemoteControl <|-- ConcreteRemoteControl2
    TV <|-- Sony
    TV <|-- RCA
    RemoteControl o-- TV : 桥接

“桥”就体现在 RemoteControl 组合了 TV:两个原本会通过继承爆炸出 2×2=4 个类的维度(遥控器类型 × 电视品牌),被拆成两个可独立扩展的层次。

实现

RemoteControl 表示遥控器,指代 Abstraction;TV 表示电视,指代 Implementor。桥接模式将遥控器和电视分离开来,从而可以独立改变遥控器或者电视的实现。

public abstract class TV {
    public abstract void on();
    public abstract void off();
    public abstract void tuneChannel();
}

public class Sony extends TV {
    @Override
    public void on() {
        System.out.println("Sony.on()");
    }

    @Override
    public void off() {
        System.out.println("Sony.off()");
    }

    @Override
    public void tuneChannel() {
        System.out.println("Sony.tuneChannel()");
    }
}

public class RCA extends TV {
    @Override
    public void on() {
        System.out.println("RCA.on()");
    }

    @Override
    public void off() {
        System.out.println("RCA.off()");
    }

    @Override
    public void tuneChannel() {
        System.out.println("RCA.tuneChannel()");
    }
}
public abstract class RemoteControl {
    protected TV tv;

    public RemoteControl(TV tv) {
        this.tv = tv;
    }

    public abstract void on();
    public abstract void off();
    public abstract void tuneChannel();
}

public class ConcreteRemoteControl1 extends RemoteControl {
    public ConcreteRemoteControl1(TV tv) {
        super(tv);
    }

    @Override
    public void on() {
        System.out.println("ConcreteRemoteControl1.on()");
        tv.on();
    }

    @Override
    public void off() {
        System.out.println("ConcreteRemoteControl1.off()");
        tv.off();
    }

    @Override
    public void tuneChannel() {
        System.out.println("ConcreteRemoteControl1.tuneChannel()");
        tv.tuneChannel();
    }
}

public class ConcreteRemoteControl2 extends RemoteControl {
    public ConcreteRemoteControl2(TV tv) {
        super(tv);
    }

    @Override
    public void on() {
        System.out.println("ConcreteRemoteControl2.on()");
        tv.on();
    }

    @Override
    public void off() {
        System.out.println("ConcreteRemoteControl2.off()");
        tv.off();
    }

    @Override
    public void tuneChannel() {
        System.out.println("ConcreteRemoteControl2.tuneChannel()");
        tv.tuneChannel();
    }
}
public class Client {
    public static void main(String[] args) {
        RemoteControl remoteControl1 = new ConcreteRemoteControl1(new RCA());
        remoteControl1.on();
        remoteControl1.off();
        remoteControl1.tuneChannel();
    }
}

JDK 中的应用

  • AWT(它提供了抽象层,将窗口支持映射到本地操作系统上)
  • JDBCConnection 是抽象,不同数据库驱动是实现;JDBC 的驱动加载机制可参考 SPI 机制详解

系列导航

← Angular 22+ 教程 10:ng-template 与 TemplateRef 目录 软件工程 010:敏捷软件开发理论及流程 →
← 返回文章列表