• 结构型设计模式——桥接模式


    摘要

    桥接模式(Bridge pattern): 使用桥接模式通过将实现和抽象放在两个不同的类层次中而使它们可以独立改变。

    一、桥接模式的意图

    桥接模式 (Bridge) 是一种结构型设计模式, 可将抽象部分与实现部分分离,使它们都可以独立的变化。如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的联系。抽象化角色和具体化角色都应该可以被子类扩展。

    在这种情况下,桥接模式可以灵活地组合不同的抽象化角色和具体化角色,并独立化地扩展。设计要求实现化角色的任何改变不应当影响客户端,或者说实现化角色的改变对客户端是完全透明的。

    二、桥接模式的场景

    • 如果你想要拆分或重组一个具有多重功能的庞杂类(例如能与多个数据库服务器进行交互的类),可以使用桥接模式。
    • 如果你希望在几个独立维度上扩展一个类, 可使用该模式。
    • 如果你需要在运行时切换不同实现方法, 可使用桥接模式。

    三、桥接模式的类图

    • 抽象部分 (Abstraction) 提供高层控制逻辑, 依赖于完成底层实际工作的实现对象。
    • 实现部分 (Implementation) 为所有具体实现声明通用接口。 抽象部分仅能通过在这里声明的方法与实现对象交互。
      • 抽象部分可以列出和实现部分一样的方法, 但是抽象部分通常声明一些复杂行为, 这些行为依赖于多种由实现部分声明的原语操作。
    • 具体实现 (Concrete Implementations) 中包括特定于平台的代码。
    • 精确抽象 (Refined Abstraction) 提供控制逻辑的变体。 与其父类一样, 它们通过通用实现接口与不同的实现进行交互。
    • 通常情况下, 客户端 (Client) 仅关心如何与抽象部分合作。 但是, 客户端需要将抽象对象与一个实现对象连接起来

    四、桥接模式的实现

    【Implementor】定义实现接口

    1. interface Implementor {
    2. // 实现抽象部分需要的某些具体功能
    3. public void operationImpl();
    4. }

    【Abstraction】定义抽象接口

    1. abstract class Abstraction {
    2. // 持有一个 Implementor 对象,形成聚合关系
    3. protected Implementor implementor;
    4. public Abstraction(Implementor implementor) {
    5. this.implementor = implementor;
    6. }
    7. // 可能需要转调实现部分的具体实现
    8. public void operation() {
    9. implementor.operationImpl();
    10. }
    11. }

    【ConcreteImplementor】实现 Implementor 中定义的接口

    1. class ConcreteImplementorA implements Implementor {
    2. @Override
    3. public void operationImpl() {
    4. // 真正的实现
    5. System.out.println("具体实现A");
    6. }
    7. }
    8. class ConcreteImplementorB implements Implementor {
    9. @Override
    10. public void operationImpl() {
    11. // 真正的实现
    12. System.out.println("具体实现B");
    13. }
    14. }

    【RefinedAbstraction】扩展 Abstraction 类。

    1. class RefinedAbstraction extends Abstraction {
    2. public RefinedAbstraction(Implementor implementor) {
    3. super(implementor);
    4. }
    5. public void otherOperation() {
    6. // 实现一定的功能,可能会使用具体实现部分的实现方法,
    7. // 但是本方法更大的可能是使用 Abstraction 中定义的方法,
    8. // 通过组合使用 Abstraction 中定义的方法来完成更多的功能。
    9. }
    10. }
    1. public class BridgePattern {
    2. public static void main(String[] args) {
    3. Implementor implementor = new ConcreteImplementorA();
    4. RefinedAbstraction abstraction = new RefinedAbstraction(implementor);
    5. abstraction.operation();
    6. abstraction.otherOperation();
    7. }
    8. }
    9. ----------------------------------------------------------
    10. 具体实现A
    11. 其他操作

    五、桥接模式开源示例

    • 使用示例: 桥接模式在处理跨平台应用、 支持多种类型的数据库服务器或与多个特定种类 (例如云平台和社交网络等) 的 API 供应商协作时会特别有用。
    • 识别方法: 桥接可以通过一些控制实体及其所依赖的多个不同平台之间的明确区别来进行识别。
    • Java 中桥接模式应用最经典的代表无疑是日志组件 slf4j 的桥接 jar 包。假如,你正在开发应用程序所调用的组件当中已经使用了 common-logging,这时你需要 jcl-over-slf4j.jar 把日志信息输出重定向到 slf4j-api,slf4j-api 再去调用 slf4j 实际依赖的日志组件。这个过程称为桥接。下图是官方的 slf4j 桥接策略图:

    六、桥接模式的总结

    • 桥接模式通常会于开发前期进行设计,使你能够将程序的各个部分独立开来以便开发。另一方面,适配器模式通常在已有程序中使用,让相互不兼容的类能很好地合作。
    • 桥接、状态模式和策略模式(在某种程度上包括适配器)模式的接口非常相似。实际上,它们都基于组合模式——即将工作委派给其他对象,不过也各自解决了不同的问题。模式并不只是以特定方式组织代码的配方,你还可以使用它们来和其他开发者讨论模式所解决的问题。
    • 你可以将抽象工厂模式和桥接搭配使用。如果由桥接定义的抽象只能与特定实现合作,这一模式搭配就非常有用。在这种情况下,抽象工厂可以对这些关系进行封装,并且对客户端代码隐藏其复杂性。
    • 你可以结合使用生成器模式和桥接模式团︰主管类负责抽象工作,各种不同的生成器负责实现工作。

    博文参考

    设计模式之桥接模式 | DESIGN

    结构型 - 桥接(Bridge) | Java 全栈知识体系

  • 相关阅读:
    Redis 安装和启动
    STM32使用串口空闲中断(IDLE)和 DMA接收一串数据流
    CMake教程-第 12 步:打包调试和发布
    python3.10.10安装
    Python数据结构(队列)
    Java面向对象(高级)-- static关键字的使用
    山西电力市场日前价格预测【2023-09-19】
    学习记录11
    电商小程序10分类管理
    《LeetCode力扣练习》代码随想录——链表(环形链表II---Java)
  • 原文地址:https://blog.csdn.net/weixin_41605937/article/details/133337555