设计模式 | 桥接模式

简介: 桥接模式是一个非常实用的设计模式,在桥接模式中体现了很多面向对象设计原则思想,包括单一职责原则、开闭原则,合成复用原则、里氏代换原则、依赖倒转原则等。熟悉桥接模式将有助于用户深人理解这些设计原则,也有助于形成正确的设计思想和培养良好的设计风格。

1 | 桥接模式的概述

5b680cf59449caa0890cdf0ba19c575.png

桥接模式是一种很实用的对象结构型设计模式,它又被称为柄体模式(Handle and Body)接口(Interface)模式。如果系统种某个类存在两个独立变化的维度。通过桥接模式可以将这两个维度分离出来,使两者可以独立扩展。桥接模式使用一种巧妙的方式处理多层继承存在的问题,用抽象关联取代了传统的多层继承,将类之间的静态继承关系转换为动态的对象组合关系,使得系统更加灵活,并且易于扩展,同时有效控制了系统中类的个数。


bfe957000b9bc03a022368ed88f2d6e.png


1.1 桥接模式的定义

    • 桥接模式:将抽象部分与它的实现部分解耦,使得两者都能够独立变化。
    • Bridge Pattern:Decouple an abstraction from its implementation so that the two can vary independently.


    2 | 桥接模式的结构与实现


    2.1 桥接模式的结构


    001751645611e9f818583e1071501e0.png


    桥接模式包含以下 4 个角色:

      • (1)Abstraction(抽象类):它是用于定义抽象类的接口,通常是抽象类而不是接口,其中定义了一个 Implementor(实现类接口)类型的对象并可以维护该对象,它与 lmplementor 之间具有关联关系,既可以包含抽象业务方法,也可以包含具体业务方法。
      • (2)RefinedAbstraction(扩充抽象类):它扩充由 Abstraction 定义的接口,通常情况下不再是抽象类而是具体类,实现了在 Abstraction 中声明的抽象业务方法,在 RefinedAbstractior 中可以调用在 lmplementor 中定义的业务方法。
      • (3) IImplementor(实现类接口):它是定义实现类的接口,这个接口不一定要 Abstraction 的接口完全一致,事实上这两个接口可以完全不同。一般而言,Implementor 口仅提供基本操作,面 Abstraction 定义的接口可能会做更多更复杂的操作。Implemen接口对这些基本操作进行了声明,而将具体实现交给其子类。通过关联关系,在 Abstraction 中不仅可以拥有自已的方法,还可以训用 Implementor 中定义的方法,使用关联关系来替代继承关系。
      • (4) Concretclmplementor(具体实现类):它具体实现了 Implementor 接口,在不同 Coneretelmplementor中提供基本操作的不同实现,在程序运行时,Concretelmplementor 象将精换其父类对象,提供给抽象类具体的业务操作方法。


      2.2 桥接模式的实现


      桥接模式是一个非常实用的设计模式,在桥接模式中体现了很多面向对象设计原则思想,包括单一职责原则、开闭原则,合成复用原则、里氏代换原则、依赖倒转原则等。熟悉桥接模式将有助于用户深人理解这些设计原则,也有助于形成正确的设计思想和培养良好的设计风格。


      在使用桥接模式时,用户首先应该识别出一个类所具有的两个独立变化的维度,将它们设计为两个独立的继承等级结构,为两个维度都提供抽象层,并建立抽象耦合。


      通常情况下,将具有两个独立变化维度的类的一些普通业务方法和与之关系最密切的维度设计为“抽象类”层次结构(抽象部分),而将另一个维度设计为“实现类”层次结构(实现部分)。


      代码设计

      using System;
      namespace BridgePattern.Sample
      {
          // 接口定义
          interface IImplementor
          {
              void OperationImpl();
          }
          // 继承关系,实现接口方法
          class ConcreteImplementor : IImplementor
          {
              public void OperationImpl()
              {
                  Console.WriteLine("ConcreteImplementor.OperationImpl => 具体业务方法实现");
              }
          }
          // 建立抽象耦合
          abstract class Abstraction
          {
              protected IImplementor _Impl; //定义实现类接口对象
              public void SetImpl(IImplementor impl)
              {
                  _Impl = impl;
              }
              public abstract void Operation();  //声明抽象业务方法
          }
          // 抽象具体实现
          class RefinedAbstraction : Abstraction 
          {
            public override void Operation() 
              {
                  Console.WriteLine("===业务代码(调用方法前)===");
                  IImplementor implementor = new ConcreteImplementor();
                  SetImpl(implementor);
                  _Impl.OperationImpl();  //调用实现类的方法
                  Console.WriteLine("===业务代码(调用方法后)===");
              }
          }
      }

      image.gif

      客户端调用,如下所示:

      f895b054dc5bb0a6ee38bad122aa925.png

      image.gif

      3 | 桥接模式应用实例


      3.1 实例说明

      065c60299575d2d4c74b6a9fe35d1ad.png

      3.2 类图结构

      742d31bbc55cf30e92b678c25b31385.pngimage.gif


      3.3 实例代码


      • (1) Matrix:像素矩阵类,辅助类
      • (2) IImageImp:抽象操作系统实现类,充当实现类接口
      • (3) WindowsImp:Windows 操作系统实现类,充当具体实现类
      • (4) LinuxImp:Linux 操作系统实现类,充当具体实现类
      • (5) UnixImp:UNIX 操作系统实现类,充当具体实现类
      • (6) Image:抽象图像类,充当抽象类
      • (7) JPGImage:JPG 格式图像类,充当扩充抽象类
      • (8) PNGImage:PNG 格式图像类,充当扩充抽象类
      • (9) BMPImage:BMP 格式图像类,充当扩充抽象类
      • (10) GIFImage:GIF 格式图像类,充当扩充抽象类
      • (11) App.config 配置文件
      • (12) Program:客户端测试类


      <?xml version="1.0" encoding="utf-8" ?>
      <configuration>
        <appSettings>
          <!--RefinedAbstraction-->
          <add key="image" value="BridgePattern.Sample.BMPImage"/>
          <!--ConcreteImplementor-->
          <add key="os" value="BridgePattern.Sample.LinuxImp"/>
        </appSettings>
      </configuration>

      image.gif

      客户端调用,如下所示:

      ea8fd77bcfeee259609d015ce7a5cfe.pngimage.gif


      完整代码示例请查看 =》DesignPattern: DesignPattern GoF 23+1 | 设计模式 23+1 - Gitee.com


      4 | 桥接模式与适配器模式的联合使用


      • 桥接模式:用于系统的初步设计,对于存在两个独立变化维度的类可以将其分为抽象化和实现化两个角色,使它们可以分别进行扩展变化。
      • 适配器模式:当发现系统与已有类无法协同工作时。


      5 | 桥接模式的优缺点与适用环境


      5.1 桥接模式的优点

      • √分离抽象接口及其实现部分。
      • √可以取代多层继承方案,极大地减少了子类的个数。
      • √提高了系统的可扩展性,在两个变化维度中任意扩展一个维度,不需要修改原有系统,符合开闭原则。


      5.2 桥接模式的缺点

      • √会增加系统的理解与设计难度,由于关联关系建立在抽象层,要求开发者一开始就针对抽象层进行设计与编程。
      • √正确识别出系统中两个独立变化的维度并不是一件容易的事情。


      5.3 桥接模式的适用环境


      • √需要在抽象化和具体化之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系。
      • √抽象部分和实现部分可以以继承的方式独立扩展而互不影响。
      • √一个类存在两个(或多个) 独立变化的维度,且这两个(或多个)维度都需要独立地进行扩展。
      • √不希望使用继承或因为多层继承导致系统类的个数急剧增加的系统。
      目录
      相关文章
      |
      设计模式 开发者
      【设计模式】第七篇:和我一起简单认识桥接模式
      实现的意思并不是指抽象的派生类,而是指通过组合来代替继承关系,从而降低抽象和具体实现产品两个可变换维度之间的耦合,就像我们的相机品牌和相机产品类型之间的分离
      143 4
      |
      设计模式 Java
      【设计模式】JAVA Design Patterns——Bridge(桥接模式)
      【设计模式】JAVA Design Patterns——Bridge(桥接模式)
      【设计模式】JAVA Design Patterns——Bridge(桥接模式)
      |
      设计模式
      设计模式之桥接模式
      设计模式之桥接模式
      |
      设计模式 Linux Windows
      【设计模式】桥接模式
      【设计模式】桥接模式
      129 0
      |
      7月前
      |
      关系型数据库 Java MySQL
      【设计模式】【结构型模式】桥接模式(Bridge)
      一、入门 什么是桥接模式? 桥接模式(Bridge Pattern)是一种结构型设计模式,核心思想是将抽象与实现分离,让它们可以独立变化。简单来说,它像一座“桥”连接了两个维度的变化,避免用继承导致代
      388 10
      |
      11月前
      |
      设计模式 前端开发 数据库
      「全网最细 + 实战源码案例」设计模式——桥接模式
      桥接模式(Bridge Pattern)是一种结构型设计模式,通过将抽象部分与实现部分分离,使它们可以独立变化,从而降低代码耦合度,避免类爆炸,提高可扩展性。其结构包括实现类接口、具体实现类、抽象类和精确抽象类。适用于多维度扩展类、隐藏实现细节、简化庞杂类以及运行时切换实现方法的场景。优点包括高扩展性、隐藏实现细节、遵循开闭原则和单一职责原则;缺点是可能增加代码复杂度。示例中展示了不同操作系统播放不同格式视频文件的实现。
      237 19
      |
      设计模式 PHP 开发者
      PHP中的设计模式:桥接模式的解析与应用
      在软件开发的浩瀚海洋中,设计模式如同灯塔一般,为开发者们指引方向。本文将深入探讨PHP中的一种重要设计模式——桥接模式。桥接模式巧妙地将抽象与实现分离,通过封装一个抽象的接口,使得实现和抽象可以独立变化。本文将阐述桥接模式的定义、结构、优缺点及其应用场景,并通过具体的PHP示例代码展示如何在实际项目中灵活运用这一设计模式。让我们一起走进桥接模式的世界,感受它的魅力所在。
      |
      设计模式 自然语言处理 算法
      PHP中的设计模式:桥接模式的深入探索与应用
      在PHP开发中,理解并运用设计模式是提升代码质量与可维护性的关键。本文聚焦于桥接模式——一种结构型设计模式,它通过封装一个抽象的接口,将实现与抽象分离,从而使得它们可以独立变化。不同于传统摘要的概述式表述,本文将以故事化的情境引入,逐步解析桥接模式的精髓,通过PHP代码示例详细展示其在实际项目中的应用,旨在为读者提供一个既深刻又易于理解的学习体验。
      150 19
      |
      设计模式 XML 存储
      【七】设计模式~~~结构型模式~~~桥接模式(Java)
      文章详细介绍了桥接模式(Bridge Pattern),这是一种对象结构型模式,用于将抽象部分与实现部分分离,使它们可以独立地变化。通过实际的软件开发案例,如跨平台视频播放器的设计,文章阐述了桥接模式的动机、定义、结构、优点、缺点以及适用场景,并提供了完整的代码实现和测试结果。桥接模式适用于存在两个独立变化维度的系统,可以提高系统的可扩展性和灵活性。
      【七】设计模式~~~结构型模式~~~桥接模式(Java)
      |
      设计模式 Java
      Java设计模式-桥接模式(9)
      Java设计模式-桥接模式(9)

      热门文章

      最新文章