8 桥接模式
8.1 桥接模式概述
Bridge Pattern: 将抽象部分与它的实现部分解耦,使得两者都能够独立变化。
桥接模式是一种很实用的结构型模式,如果系统中某个类存在两个独立变化的维度,通过桥接模式将这两个维度分离出来,使两者可以独立扩展。
桥接模式结构图如下所示:
8.2 桥接模式实现
8.2.1 抽象类
它通常是抽象类,而不是接口,其中定义了一个实现类接口的对象并维护该对象。
public abstract class Abstraction {
private Implement impl;
public void setImplement(Implement impl) {
this.impl = impl;
}
public void operation();
}
8.2.2 具体类
public class Concrete extends Abstraction {
// 实现父类的抽象方法
public void operation() {
impl.operationImpl();
}
}
8.2.3 实现类接口
public interface Implement {
public void operationImpl();
}
8.2.4 具体实现类
它实现了 Implement 接口,在不同的 ConcreteImplement 中提供操作的不同实现。
public class ConcreteImplementA implements Implement {
public void operationImpl() {
// 具体业务逻辑实现 A
}
}
public class ConcreteImplementB implements Implement {
public void operationImpl() {
// 具体业务逻辑实现 B
}
}
8.2.5 客户端调用类
public class Client {
public static void main(String[] args) {
Abstraction abs = new ConcreteA();
Implement impl = new ImplementA();
abs.setImplment(impl);
abs.operation();
}
}
8.3 结合具体例子理解桥接模式
可能光看上面对桥接模式的理论有点难以理解,下面我门结合具体的例子来解释桥接模式做了什么,这么做的优势在哪里。
例子说明:
某软件系统要求能够显示 JPG、GIF、PNG 等多种格式图片,且能够在 Windows、Linux 等多个操作系统上运行。系统首先将各种格式文件转换为像素矩阵,在不同的操作系统中调用不同的绘制函数来绘制像素矩阵。系统需要较好的扩展性,以便在将来支持更多的图片格式和操作系统。
这个例子就将图片格式与操作系统这两个独立变化的维度分离。如果这两个成员变量都耦合在一个类中,那么要实现上述的扩展则需要 3 * 2 = 6 个子类来实现,而分离出来独立变化则只需要 3 + 2 = 5 个额外的类,当然变化的维度越多,桥接模式的效果则越显著。
8.4 桥接模式优/缺点
桥接模式的优点主要如下:
- 分离抽象接口与其实现部分,使得抽象部分和实现部分可以沿着各自的维度变化
- 桥接模式可以取代多层继承方案,极大地减少子类的个数
- 桥接模式提高了系统的扩展性,增加/删除都不需要修改原有代码,符合开闭原则
桥接模式的缺点主要如下:
- 增加系统的理解与设计难度,因为关联关系建立在抽象层,要求一开始就针对抽象层进行设计