简介
桥接设计模式(Bridge Design Pattern)也叫作桥梁模式,其描述是将实现和抽象放在两个不同的类层次中,使两个层次可以独立地变化。
桥接模式采用抽象关联取代了传统的多层继承,将类之间的静态继承关系转化为动态的对象组合关系,使系统更加灵活,并易于扩展,同时有效控制了系统中类的个数。
在桥接模式中,有以下概念需要理解:
- 抽象化:将对象共同的性质抽取出去而形成类的过程
- 实现化:和抽象化是一个互逆的过程,实现化是对抽象化事物的进一步具体化
- 脱耦:将抽象化和实现化之间强关联改换成弱关联,将两个角色之间的继承关系改为关联关系
桥接模式主要解决的是多维度的指数级变化。
具体实现
以手机为例,手机既可以按照品牌分类,也可以按照手机软件来分类,两种维度交叉的变化远必一种维度多得多。
手机软件代码示例如下:
// 抽象类
public abstract class HandsetSoft {
public abstract void run();
}
// 实现类
public class HandsetGame extends HandsetSoft {
@Override
public void run() {
System.out.println("运行手机游戏");
}
}
public class HandsetAddressList extends HandsetSoft {
@Override
public void run() {
System.out.println("运行手机通讯录");
}
}
手机品牌代码示例如下:
// 抽象类
public abstract class HandsetBrand {
protected HandsetSoft soft;
// 设置手机软件
public void setHandsetSoft(HandsetSoft soft) {
this.soft = soft;
}
// 运行
public abstract void run();
}
// 实现类
public class HandsetBrandA extends HandsetBrand {
@Override
public void run() {
soft.run();
}
}
public class HandsetBrandB extends HandsetBrand {
@Override
public void run() {
soft.run();
}
}
客户端代码示例如下:
public class Client {
public static void main(String[] args) {
HandsetBrand ab;
// A 品牌
ab = new HandsetBrandA();
ab.setHandsetSoft(new HandsetGame());
ab.run();
ab.setHandsetSoft(new HandsetAddressList());
ab.run();
// B 品牌
ab = new HandsetBrandB();
ab.setHandsetSoft(new HandsetGame());
ab.run();
ab.setHandsetSoft(new HandsetAddressList());
ab.run();
}
}
总结
优点
桥接模式的主要优点如下:
- 实现了抽象和实现部分的分离,从而极大地提高了系统的灵活性
- 使用桥接模式替代多层继承方案,可以减少子类的个数,降低系统的管理和维护成本
- 桥接模式提高了系统的可扩展性,在两个维度中任意扩展一个维度,都不需要修改原有系统,符合开闭原则
缺点
桥接模式的主要缺点如下:
- 增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程
- 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围有一定的局限性
适用场景
桥接模式的适用场景如下:
- 对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用
- 一个类存在两个或多个独立变化的维度,且这两个或多个维度都需要独立进行扩展
源码
桥接模式是设计 Java 虚拟机和实现 JDBC 等驱动程序的核心模式之一,应用较为广泛。