桥接模式是一种结构型设计模式, 可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构, 从而能在开发时分别使用。
桥接模式通过将继承改为组合的方式来解决这个问题。 具体来说, 就是抽取其中一个维度并使之成为独立的类层次, 这样就可以在初始类中引用这个新层次的对象, 从而使得一个类不必拥有所有的状态和行为。
抽象部分和实现部分
设计模式_四人组_的著作 在桥接定义中提出了_抽象部分_和_实现部分_两个术语。 我觉得这些术语过于学术了, 反而让模式看上去比实际情况更加复杂。 在介绍过形状和颜色的简单例子后, 我们来看看四人组著作中让人望而生畏的词语的含义。
抽象部分 (也被称为_接口_) 是一些实体的高阶控制层。 该层自身不完成任何具体的工作, 它需要将工作委派给_实现部分_层 (也被称为_平台_)。
注意, 这里提到的内容与编程语言中的_接口_或_抽象类_无关。 它们并不是一回事。
在实际的程序中, 抽象部分是图形用户界面 (GUI), 而实现部分则是底层操作系统代码 (API), GUI 层调用 API 层来对用户的各种操作做出响应。
一般来说, 你可以在两个独立方向上扩展这种应用:
开发多个不同的 GUI (例如面向普通用户和管理员进行分别配置)
支持多个不同的 API (例如, 能够在 Windows、 Linux 和 macOS 上运行该程序)。
你可以将特定接口-平台的组合代码抽取到独立的类中, 以在混乱中建立一些秩序。 但是, 你很快会发现这种类的数量_很多_。 类层次将以指数形式增长, 因为每次添加一个新的 GUI 或支持一种新的 API 都需要创建更多的类。
让我们试着用桥接模式来解决这个问题。 该模式建议将类拆分为两个类层次结构:
抽象部分: 程序的 GUI 层。
实现部分: 操作系统的 API。
Java 示例代码:
public class BridgePattern {
public static void main(String\[\] args) {
Product productA1 = new ProductA();
Product productA2 = new ProductA();
Color red = new Red();
productA1.setName("产品A1");
productA1.setColor(red);
productA1.Operation();
Blue blue = new Blue();
productA2.setName("产品A2");
productA2.setColor(blue);
productA2.Operation();
}
}
abstract class Product {
private String name;
protected Color color;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setColor(Color color) {
this.color = color;
}
public abstract void Operation();
}
class ProductA extends Product {
@Override
public void Operation() {
color.OperationImp(this.getName());
}
}
interface Color {
public void OperationImp(String name);
}
class Red implements Color {
@Override
public void OperationImp(String name) {
System.out.println(name + ":红色");
}
}
class Blue implements Color {
@Override
public void OperationImp(String name) {
System.out.println(name + ":蓝色");
}
}