从JDK中学习设计模式——桥接模式

570 阅读2分钟

这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战

概述

桥接模式(Bridge Pattern)是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。

桥接模式将抽象部分与它的实现部分分离,使它们都可以独立地变化。例如:张三开了一家水壶制造厂,有大、中、小三种型号,水壶可以镀金、镀银、镀铜,在非桥接模式中就需要 3 * 3 种机器来生产这九种产品,在桥接模式中,把水壶型号作为抽象类,水壶镀漆可以当做实现类,水壶型号和镀漆种类可以独立变化。

结构

桥接模式UML.png

  • Abstraction(抽象类):它一般是抽象类,其中定义了实现类接口类型的对象,并可以维护该对象。
  • RefinedAbstraction(扩充抽象类):扩充抽象类中定义的接口,实现抽象类中声明的抽象业务方法,通常情况下它不再是抽象类,而是具体类。在扩充抽象类中可以调用在实现类接口中定义的业务方法。
  • Implementor(实现类接口):它一般是抽象类的某个可变化属性,仅提供基本操作的声明,具体实现交给其子类。
  • ConcreteImplementor(具体实现类):在不同的具体实现类中提供基本操作的不同实现,为抽象类提供具体的业务操作方法。

优点

  1. 将抽象和实现解耦,使它们可以独立扩展,符合开闭原则、单一职责原则
  2. 桥接模式通过对实现类接口的引用,变相实现了多继承,但它复用性更强,符合合成复用原则
  3. 客户端的关联类是抽象类和实现类接口,它们一般是抽象类或接口,符合里氏代换原则、依赖倒转原则

缺点

  1. 桥接模式的使用会增加系统的理解与设计难度,由于关联关系建立在抽象层,因此一开始就必须对抽象层进行设计与编程。
  2. 桥接模式要求正确识别出系统中两个独立变化的维度,而这需要一定经验的积累。

应用场景

  1. 不希望或不适用使用继承的场景。
  2. 接口或抽象类不稳定的场景。一个类存在多个维度,并且这些维度都需要独立进行扩展。
  3. 重用性要求较高的场景。设计的颗粒度越细,则被重用的可能性就越大,采用继承则会增加耦合性,受到父类的限制。Atomic CSS 就十分符合这种模式。

JDK 中的应用

在 JDK 中 java.util.logging 就使用了桥接模式。

Handler.png