定义
桥接模式是将抽象部分与它的实现部分分离, 使他们都可以独立地变化, 它是一种对象结构型模式, 又称为柄体(Handle and Body)模式或接口(Interface)模式。
分析:**
这个场景中有两个变化的维度: 品牌—— 类型
优缺点
优点:
- 实现了抽象和实现部分的分离:桥接模式分离了抽象部分和实现部分,从而极大的提供了系统的灵活性,让抽象部分和实现部分独立开来,分别定义接口,这有助于系统进行分层设计,从而产生更好的结构化系统;
- 更好的可扩展性 :抽象部分和实现部分可以分别独立扩展,而不会相互影响,大大的提供了系统的可扩展性;
可动态切换实现 : 由于桥接模式实现了抽象和实现的分离,所以在实现桥接模式时,就可以实现动态的选择和使用具体的实现。
缺点:
桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程。
- 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围有一定的局限性。
适用场景
- 一个类存在两个独立变化的维度,且这两个维度都需要进行扩展;
- 不希望或不适用使用继承的场景,可以考虑用桥接模式
- 接口或抽象类不稳定的场景,可以考虑用桥接模式
- 重用性要求较高的场景,可以考虑用桥接模式
应用实例:
(1)开关。我们可以看到的开关是抽象的,不用管里面具体怎么实现;
(2)手机品牌与手机软件。两者间有一条聚合线,一个手机品牌可以有多个手机软件。
不要一涉及继承就考虑该模式,尽可能把变化的因素封装到最细、最小的逻辑单元中,避免风险扩散
桥接模式实现方法

Brand 品牌
//品牌public interface Brand {void info();}
Lenovo/Apple/Daire
//联想品牌public class Lenovo implements Brand {@Overridepublic void info() {System.out.print("联想");}}-------------------------------------------//苹果品牌public class Apple implements Brand {@Overridepublic void info() {System.out.print("苹果");}}-------------------------------------------//戴尔品牌public class Apple implements Brand {@Overridepublic void info() {System.out.print("戴尔");}}
Computer 电脑
//抽象的电脑类型类public abstract class Computer {//组合,品牌~protected Brand brand;public Computer(Brand brand) {this.brand = brand;}public void info() {brand.info();//自带品牌}}-------------------------------------------------class Desktop extends Computer {public Desktop(Brand brand) {super(brand);}@Overridepublic void info() {super.info();System.out.print("台式机");}}-------------------------------------------------class Laptop extends Computer {public Laptop(Brand brand) {super(brand);}@Overridepublic void info() {super.info();System.out.print("笔记本");}}------------------------------------------------class Pad extends Computer {public Laptop(Brand brand) {super(brand);}@Overridepublic void info() {super.info();System.out.print("平板");}}
测试
public class Test {public static void main(String[] args) {//苹果管记本Computer computer = new Laptop(new Apple());computer.info();System.out.println();//联想台式机Computer computer2 = new Desktop(new Lenovo());computer2.info();}}
JDBC中的桥接模式
使用JCBC的时候,一直很困惑获取connection的过程和原理,为什么把不同的数据库驱动名称放到Class.forName()中就能获取到对应的数据库连接呢?

Oracle为例,通过Class.forName(“oracle.jdbc.OracleDriver”)类加载的时候执行静态代码块将Driver注册到DriverManager,DriverManager是个Driver容器,管理不同的Driver,这样具体的数据Driver实现就统一交给容器管理,客户端通过DriverManager执行验证连接,获取连接的操作。
