桥接模式

桥接模式bridge

桥接模式是抽象部分与它的实现部分分离, 使他们可以独立的变化, 它是一种对象结构模式, 又称为柄体(handle and Body)模式或接口(Interface)模式 .桥接模式可以和适配器模式连用

案例

思考

例如下图的继承关系

当我想增加一个新的品牌时, 比如神州品牌, 需要同时为台式, 笔记本和平板都要添加一个类, 过程比较繁琐, 这只是3中类型, 如果更多的类型, 那么工作量时非常巨大的

这时我们可以把电脑类型和品牌看成一个坐标系:(如下图)

图中每一个x轴和y轴的交点都可以表示一种类型的品牌电脑, 我们只需要想办法把类型和品牌联系起来(桥接), 就可以按照需求把电脑组装出来, 这样就降低了维护成本, 如果我想添加一个电脑类型, 只需要在y轴添加一种即可, 添加品牌只需要在x轴添加, 然后根据自己的需要组装电脑.

代码案例

Brand品牌的接口

// 品牌
public interface Brand {
    void info();
}

Apple苹果品牌, 实现品牌接口Brand

// 苹果品牌
public class Apple implements Brand {
    @Override
    public void info() {
        System.out.print("苹果"); // 打印品牌信息
    }
}

Lenovo联想品牌, 实现品牌接口Brand

// 联想品牌
public class Lenovo implements Brand {
    @Override
    public void info() {
        System.out.print("联想"); // 打印品牌信息
    }
}

Computer电脑抽象类, 使用品牌和类型组装 (可以为普通类)

public abstract class Computer {
    // 组合, 品牌, 起到桥接作用
    protected Brand brand;

    // 有参构造
    public Computer(Brand brand) {
        this.brand = brand;
    }

    // 电脑的info(), 调用品牌Brand的info()
    public void info() {
        brand.info();// 自带品牌
    }
}

Desktop台式机类, 继承Computer抽象类

class Desktop extends Computer {
    public Desktop(Brand brand) {
        super(brand);
    }

    @Override // 重写电脑Computer的info()
    public void info() {
        super.info();
        System.out.println("台式机");
    }
}

Laptop笔记本电脑类, 继承Computer抽象类

class Laptop extends Computer {
    public Laptop(Brand brand) {
        super(brand);
    }

    @Override // 重写电脑Computer的info()
    public void info() {
        super.info();
        System.out.println("笔记本");
    }
}

测试类Test

public class Test {
    public static void main(String[] args) {
        // 按照需求组装出对应的电脑
        // 苹果笔记本
        Computer computer = new Laptop(new Apple());
        computer.info();
        // 联想台式机
        Computer computer1 = new Desktop(new Lenovo());
        computer1.info();
    }
}

运行结果:

苹果笔记本
联想台式机

结构示意图: 这样电脑类型和品牌之间就建立了联系, 这就是桥接

优缺点

好处:

  • 桥接模式偶尔类似于多继承方案,但是多继承方案违背了类的单一职责原则,复用性比较差,类的个数也非常多,桥接模式是比多继承方案更好的解决方法。极大的减少了子类的个数,从而降低管理和维护的成本
  • 桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。符合开闭原则,就像一座桥,可以把两个变化的维度连接起来!

劣势:

  • 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
  • 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性

最佳实践:

  • 如果一个系统需要在构建的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。抽象化角色和实现化角色可以以继承的方式独立扩展而互不影响,在程序运行时可以动态将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系统需要对抽象化角色和实现化角色进行动态耦合。
  • 一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
  • 虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。

场景

  • Java语言通过Java虚拟机实现了平台的无关性。
  • AWT中的Peer架构
  • JDBC驱动程序也是桥接模式的应用之一
posted @ 2020-06-07 18:09  zpk-aaron  阅读(208)  评论(0编辑  收藏  举报