「全网最细 + 实战源码案例」设计模式——桥接模式

embedded/2025/2/6 18:27:09/

核心思想

  • 桥接模式(Bridge Pattern)是一种结构型设计模式将抽象部分与其实现部分分离,使它们可以独立变化。降低代码耦合度,避免类爆炸,提高代码的可扩展性。


结构

1. Implementation(实现类接口)

  • 定义具体实现的行为接口。

2. ConcreteImplementations(具体实现类)

  • 具体的实现类,实现 Implementation 接口。

3. Abstraction(抽象类)

  • 定义高层逻辑,组合 Implementation(实现类接口)对象。

4. RefinedAbstraction(精确抽象类)

  • Abstraction 的子类,实现父类的业务方法,并通过组合关系调用实现化角色中的业务方法。


适用场景

  1. 如果你希望在几个独立维度上扩展一个类, 可使用该模式。
    1. 桥接建议将每个维度抽取为独立的类层次。 初始类将相关工作委派给属于对应类层次的对象, 无需自己完成所有工作。
  1. 希望将实现细节对外隐藏。
  2. 如果你想要拆分或重组一个具有多重功能的庞杂类 (例如能与多个数据库服务器进行交互的类), 可以使用桥接模式避免继承层次过于庞大,导致类爆炸
    1. 桥接模式可以将庞杂类拆分为几个类层次结构。 此后, 你可以修改任意一个类层次结构而不会影响到其他类层次结构。 这种方法可以简化代码的维护工作, 并将修改已有代码的风险降到最低。
  1. 如果你需要在运行时切换不同实现方法, 可使用桥接模式
    1. 桥接模式可替换抽象部分中的实现对象, 具体操作就和给成员变量赋新值一样简单。

优缺点

优点:

  • 高扩展性:你可以创建与平台无关的类和程序。
  • 隐藏实现细节:客户端代码仅与高层抽象部分进行互动, 不会接触到平台的详细信息。
  • 遵循开闭原则: 你可以新增抽象部分和实现部分, 且它们之间不会相互影响。
  • 符合单一职责原则: 抽象部分专注于处理高层逻辑, 实现部分处理平台细节。

缺点:

  • 对高内聚的类使用该模式可能会让代码更加复杂。

实现步骤

  1. 明确类中独立的维度。 独立的概念可能是: 抽象/平台, 域/基础设施, 前端/后端或接口/实现。
  2. 了解客户端的业务需求, 并在抽象基类中定义它们。
  3. 确定在所有平台上都可执行的业务。 并在通用实现接口中声明抽象部分所需的业务。
  4. 为你域内的所有平台创建实现类, 但需确保它们遵循实现部分的接口。
  5. 在抽象类中添加指向实现类型的引用成员变量。 抽象部分会将大部分工作委派给该成员变量所指向的实现对象。
  6. 如果你的高层逻辑有多个变体, 则可通过扩展抽象基类为每个变体创建一个精确抽象。
  7. 客户端代码必须将实现对象传递给抽象部分的构造函数才能使其能够相互关联。 此后, 客户端只需与抽象对象进行交互, 无需和实现对象打交道。

示例

// 实现类接口
public interface VideoFile {void decode(String fileName);
}// 具体实现类——AVI格式
public class AVIFile implements VideoFile{@Overridepublic void decode(String fileName) {System.out.println("AVI格式文件" + fileName);}
}// 具体实现类——RMVB格式
public class RMVBFile implements VideoFile{@Overridepublic void decode(String fileName) {System.out.println("RMVB格式文件" + fileName);}
}// 抽象类
public abstract class OperatingSystem {// 保证子类可以访问,而外部类不能访问,提高封装性// 不用private是因为避免子类使用时要用getter/setterprotected VideoFile videoFile;public OperatingSystem(VideoFile videoFile) {this.videoFile = videoFile;}public abstract void play(String fileName);
}// 扩展抽象类——Windows
public class Windows extends OperatingSystem{public Windows(VideoFile videoFile) {super(videoFile);}@Overridepublic void play(String fileName) {videoFile.decode(fileName);}
}// 扩展抽象类——Mac
public class Mac extends OperatingSystem{public Mac(VideoFile videoFile) {super(videoFile);}@Overridepublic void play(String fileName) {videoFile.decode(fileName);}
}// 客户端
public class Client {public static void main(String[] args) {VideoFile videoFile = new AVIFile();OperatingSystem operatingSystem = new Windows(videoFile);operatingSystem.play("test.avi");System.out.println("-----------------------------------------");videoFile = new RMVBFile();operatingSystem = new Mac(videoFile);operatingSystem.play("test.rmvb");}
}

与其他模式的关系

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

http://www.ppmy.cn/embedded/160101.html

相关文章

【办公类-99-01】20250201学具PDF打印会缩小一圈——解决办法:换一个PDF阅读器

背景需求: 2024年1月13日,快要放寒假了,组长拿着我们班的打印好的一叠教案来调整。 “前面周计划下面的家园共育有调整,你自己看批注。” “还有你这个教案部分的模版有问题,太小(窄)了。考虑…

【前端】【Ts】【知识点总结】TypeScript知识总结

一、总体概述 TypeScript 是 JavaScript 的超集,主要通过静态类型检查和丰富的类型系统来提高代码的健壮性和可维护性。它涵盖了从基础数据类型到高级类型、从函数与对象的类型定义到类、接口、泛型、模块化及装饰器等众多知识点。掌握这些内容有助于编写更清晰、结…

无法连接到远程扩展主机服务器

有一次在VSCode上设置了监听调试,动了launch.json文件,下次再打开VSCode远程连接服务器时打不开文件,报错如下: 无法连接到远程扩展主机服务器 (错误: CodeError(AsyncPipeFailed(Os { code: 2, kind: NotFound, message: “No s…

Django框架的全面指南:从入门到高级

Django框架的全面指南:从入门到高级 目录 引言Django简介安装与配置创建第一个Django项目Django的MVT架构模型(Model)视图(View)模板(Template)URL路由表单处理用户认证与权限Django Admin高级…

Web - CSS3基础语法与盒模型

概述 这篇文章是关于 Web 前端 CSS3 的基础语法与盒模型的讲解。包括 CSS3 层叠性及处理冲突规则、伪元素和新增伪类元素、属性选择器等。还介绍了文本与字体属性,如段落和行相关属性、字体文本属性。最后阐述了盒子模型,如元素隐藏、行内与块元素转换、…

OpenAI 实战进阶教程 - 第七节: 与数据库集成 - 生成 SQL 查询与优化

内容目标 学习如何使用 OpenAI 辅助生成和优化多表 SQL 查询了解如何获取数据库结构信息并与 OpenAI 结合使用 实操步骤 1. 创建 SQLite 数据库示例 创建数据库及表结构: import sqlite3# 连接 SQLite 数据库(如果不存在则创建) conn sq…

分享从零开始学习网络设备配置--任务6.5 实现园区网安全接入互联网

任务描述 某公司网络核心使用三层交换设备,实现不同办公子网的互联互通。此外,在企业网络的出口处,安装了一台路由器作为企业网络的出口设备,使用该路由器设备实现公司总部网络的互联互通。 同时,公司还借助专线接入…

C语言基础系列【3】VSCode使用

前面我们提到过VSCode有多么的好用,本文主要介绍如何使用VSCode编译运行C语言代码。 安装 首先去官网(https://code.visualstudio.com/)下载安装包,点击Download for Windows 获取安装包后,一路点击Next就可以。 配…