二十三种设计模式-桥接模式

桥接模式(Bridge Pattern)是一种结构型设计模式,其核心思想是将抽象与实现解耦,让它们可以独立变化。桥接模式主要用于解决类的继承问题,避免由于继承而带来的类层次结构过于复杂和难以维护的问题。

1. 核心概念

桥接模式通过引入一个“桥接类”(Bridge),将抽象部分(Abstraction)与实现部分(Implementation)分离,使得它们可以独立地变化。具体来说:

  • 抽象部分(Abstraction):定义了客户端使用的接口,通常包含一个指向实现部分的引用。

  • 实现部分(Implementation):定义了实现的具体细节,通常是一个接口或抽象类。

  • 桥接类(Bridge):将抽象部分与实现部分连接起来,允许它们独立变化。

2. 应用场景

桥接模式适用于以下场景:

  • 当一个类存在两个独立变化的维度时(例如,抽象和实现)。

  • 当不希望使用继承的方式将抽象和实现绑定在一起时。

  • 当需要对抽象和实现进行独立扩展时。

3. 示例代码

以下是一个典型的桥接模式的实现示例:

3.1 定义实现部分(Implementation)
// 实现部分的接口
interface Implementor {void operationImplementor();
}// 具体实现类 A
class ConcreteImplementorA implements Implementor {@Overridepublic void operationImplementor() {System.out.println("ConcreteImplementorA: Implementing operation");}
}// 具体实现类 B
class ConcreteImplementorB implements Implementor {@Overridepublic void operationImplementor() {System.out.println("ConcreteImplementorB: Implementing operation");}
}
3.2 定义抽象部分(Abstraction)
// 抽象部分
abstract class Abstraction {protected Implementor implementor; // 桥接:包含一个实现部分的引用// 设置实现部分public void setImplementor(Implementor implementor) {this.implementor = implementor;}public abstract void operation();
}
3.3 定义具体抽象类(RefinedAbstraction)
// 具体抽象类
class RefinedAbstraction extends Abstraction {@Overridepublic void operation() {System.out.println("RefinedAbstraction: Delegating operation to Implementor");implementor.operationImplementor(); // 调用实现部分的方法}
}
3.4 客户端代码
public class BridgePatternDemo {public static void main(String[] args) {// 创建具体实现类Implementor implementorA = new ConcreteImplementorA();Implementor implementorB = new ConcreteImplementorB();// 创建具体抽象类Abstraction abstraction = new RefinedAbstraction();// 设置实现部分为 A 并调用操作abstraction.setImplementor(implementorA);abstraction.operation();// 更改实现部分为 B 并调用操作abstraction.setImplementor(implementorB);abstraction.operation();}
}

4. 输出结果

运行上述代码后,输出结果如下:

RefinedAbstraction: Delegating operation to Implementor
ConcreteImplementorA: Implementing operation
RefinedAbstraction: Delegating operation to Implementor
ConcreteImplementorB: Implementing operation

5. 优点

  • 分离抽象与实现:客户端使用的抽象接口与后台的具体实现完全独立,可以独立地变化。

  • 扩展性好:可以独立地扩展抽象部分和实现部分,而无需修改另一部分的代码。

  • 减少子类数量:避免了由于多维继承带来的类爆炸问题。

6. 缺点

  • 增加系统复杂度:引入了额外的类,可能会使系统结构变得复杂。

  • 需要维护桥接关系:需要确保抽象部分和实现部分之间的桥接关系正确,否则可能导致运行时错误。

7. 实际应用

桥接模式在Java标准库中也有广泛的应用,例如:

  • java.util.Listjava.util.ArrayListList 是抽象接口,ArrayList 是具体实现类,通过桥接模式实现了接口与实现的分离。

  • java.io.InputStreamjava.io.FileInputStreamInputStream 是抽象类,FileInputStream 是具体实现类,通过桥接模式实现了抽象与实现的解耦。

桥接模式是一种非常灵活且强大的设计模式,尤其适用于需要分离抽象和实现的场景。

桥接模式的应用广泛性

桥接模式是一种经典的设计模式,被广泛应用于软件开发领域。它在许多开发框架和库中都有应用,例如Java中的AWT和Swing框架。此外,桥接模式也常与其他设计模式结合使用,以提高系统的可扩展性、灵活性和可维护性。

实际应用场景

  1. 消息通知系统
    在一个消息通知系统中,支持多种通知方式(如邮件、短信、微信等)和多种紧急程度(如普通、紧急、严重等)。通过桥接模式,可以将通知方式和紧急程度分离,使得两者可以独立扩展。

  2. 汽车引擎安装系统
    在一个汽车引擎安装系统中,支持多种汽车品牌(如奔驰、宝马等)和多种引擎类型(如200型、300型等)。通过桥接模式,可以将汽车品牌和引擎类型分离,使得两者可以独立扩展。

  3. 图形界面库
    在图形界面库中,桥接模式可以用于控件和主题的组合。例如,一个按钮控件可以有不同的显示风格(如Windows风格、Mac风格等),通过桥接模式可以将按钮的逻辑与显示风格分离。

  4. 数据库访问层
    在数据库访问层中,桥接模式可以用于数据库连接和数据库驱动的组合。例如,一个数据访问对象(DAO)可以使用不同的数据库连接实现(如JDBC连接、Hibernate连接等),通过桥接模式可以将DAO逻辑与具体的数据库连接实现分离。

  5. 消息传输协议
    在消息传输协议中,消息内容和传输方式可以作为两个独立的维度。通过桥接模式,可以实现不同消息和传输方式的组合,而无需修改消息传输协议的代码。

  6. 音频和视频播放器
    在音频和视频播放器中,播放器逻辑和解码器实现可以作为两个独立的维度。通过桥接模式,可以将播放器逻辑与具体的解码器实现分离,使得两者可以独立扩展。

  7. 支付系统
    在支付系统中,支付渠道(如微信支付、支付宝)和支付方式(如扫码支付、密码支付、人脸支付等)可以作为两个独立的维度。通过桥接模式,可以将支付渠道和支付方式分离,使得两者可以独立扩展。

桥接模式的优势

桥接模式的主要优势在于:

  • 分离抽象与实现:抽象部分和实现部分可以独立变化,符合开闭原则。

  • 减少类的数量:避免了由于多维继承导致的类爆炸问题。

  • 提高系统的可扩展性:可以在不修改现有代码的情况下,新增新的抽象和实现类。

  • 促进代码重用:通过组合的方式实现复用,降低了代码的冗余度。

使用桥接模式的注意事项

  • 桥接模式适用于多个独立变化的维度,如果只有一两个维度的变化,使用继承可能更简单。

  • 桥接模式会增加系统的复杂度,需要谨慎使用。

  • 需要正确选择和使用抽象类和接口,避免过度抽象或过于具体化。

总的来说,桥接模式在实际项目中应用广泛,尤其是在需要处理多个独立变化维度的场景中。它能够显著提高系统的灵活性、可扩展性和可维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/69217.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是Pytest Fixtures作用域及如何为Pytest Fixtures设置合适的作用域

关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理,构建成功的基石 在自动化测试工作之前,你应该知道的10条建议 在自动化测试中,重要的不是工具 编写重复代码很可能是你最不乐意做的事情之一。至少对我来说是这样。 在一个全力追…

嵌入式MCU面试笔记2

目录 串口通信 概论 原理 配置 HAL库代码 1. 初始化函数 2. 数据发送和接收函数 3. 中断和DMA函数 4. 中断服务函数 串口通信 概论 我们知道,通信桥接了两个设备之间的交流。一个经典的例子就是使用串口通信交换上位机和单片机之间的数据。 比较常见的串…

Charles 4.6.7 浏览器网络调试指南:流量过滤与分析(六)

1. 概述 在网络调试和优化过程中,Charles 不仅可以实现简单的网络抓包操作,还支持更高级的抓包技巧和流量分析功能。这些功能能够帮助开发者深入挖掘网络请求的细节,为复杂问题提供有效的解决方案。本文将重点讲解 Charles 的过滤规则、自定…

xss靶场

xss-labs下载地址&#xff1a;GitHub - do0dl3/xss-labs: xss 跨站漏洞平台 xss常见触发标签&#xff1a;XSS跨站脚本攻击实例与防御策略-CSDN博客 level-1 首先查看网页的源代码发现get传参的name的值test插入了html里头&#xff0c;还回显了payload的长度。 <!DOCTYPE …

主机监控软件WGCLOUD使用指南 - 如何设置主题背景色

WGCLOUD运维监控系统&#xff0c;从v3.5.7版本开始支持设置不同的主题背景色&#xff0c;如下 更多主题查看说明 如何设置主题背景色 - WGCLOUD

Bootstrap4 模态框

Bootstrap4 模态框 Bootstrap 是一个流行的前端框架,它可以帮助开发者快速构建响应式、移动设备优先的网站和应用程序。Bootstrap 4 是其最新版本,提供了许多易于使用的组件,其中模态框(Modal)组件是其中之一。本文将详细介绍 Bootstrap 4 模态框的用法、特性和优化技巧。…

C语言:数据的存储

本文重点&#xff1a; 1. 数据类型详细介绍 2. 整形在内存中的存储&#xff1a;原码、反码、补码 3. 大小端字节序介绍及判断 4. 浮点型在内存中的存储解析 数据类型结构的介绍&#xff1a; 类型的基本归类&#xff1a; 整型家族 浮点家族 构造类型&#xff1a; 指针类型&…

51单片机入门_01_单片机(MCU)概述(使用STC89C52芯片;使用到的硬件及课程安排)

文章目录 1. 什么是单片机1.1 微型计算机的组成1.2 微型计算机的应用形态1.3 单板微型计算机1.4 单片机(MCU)1.4.1 单片机内部结构1.4.2 单片机应用系统的组成 1.5 80C51单片机系列1.5.1 STC公司的51单片机1.5.1 STC公司单片机的命名规则 2. 单片机的特点及应用领域2.1 单片机的…

使用 OpenCV 和 Python 轻松实现人脸检测

目录 一、准备工作 二、加载人脸检测模型 三、读取图像并进行人脸检测 四、处理视频中的人脸检测 五、优化人脸检测效果 六、总结 在人工智能和计算机视觉领域,人脸检测是一项非常基础且重要的技术。通过人脸检测,我们可以在图像或视频中识别并定位人脸,进而进行后续的…

Qt 控件与布局管理

1. Qt 控件的父子继承关系 在 Qt 中&#xff0c;继承自 QWidget 的类&#xff0c;通常会在构造函数中接收一个 parent 参数。 这个参数用于指定当前空间的父控件&#xff0c;从而建立控件间的父子关系。 当一个控件被设置为另一控件的子控件时&#xff0c;它会自动成为该父控…

20250122-正则表达式

1. 正则标记 表示一位字符&#xff1a;\\ 表示指定的一位字符&#xff1a;x 表示任意的一位字符&#xff1a;. 表示任意一位数字&#xff1a;\d 表示任意一位非数字&#xff1a;\D 表示任意一个字母&#xff1a;[a-zA-Z]&#xff08;大写或小写&#xff09; 表示任意一个…

windows安装ES

1. 下载ES 访问ES官网下载Download Elasticsearch | Elastic 2. 配置环境变量 ES_JAVA_HOME : D:\jdk-17.0.9 ES_HOME : D:\elasticsearch-8.17.1-windows-x86_64\elasticsearch-8.17.1 3. 添加一些ES的配置 <1>关闭ES安全认证 打开elasticsearch-8.17.1\config\e…

基于DNN深度神经网络的OFDM+QPSK信号检测与误码率matlab仿真

目录 1.算法仿真效果 2.算法涉及理论知识概要 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2022a仿真结果如下&#xff08;完整代码运行后无水印&#xff09;&#xff1a; 仿真操作步骤可参考程序配套的操作视频。 2.算法涉及理论知识概要 在现代通信…

一文详解Filter类源码和应用

背景 在日常开发中&#xff0c;经常会有需要统一对请求做一些处理&#xff0c;常见的比如记录日志、权限安全控制、响应处理等。此时&#xff0c;ServletApi中的Filter类&#xff0c;就可以很方便的实现上述效果。 Filter类 是一个接口&#xff0c;属于 Java Servlet API 的一部…

switch组件的功能与用法

文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了PageView这个Widget,本章回中将介绍Switch Widget.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1 概念介绍 我们在这里介绍的Switch是指左右滑动的开关&#xff0c;常用来表示某项设置是打开还是关闭。Fl…

C++ 复习总结记录九

C 复习总结记录九 主要内容 1、list 介绍及使用 2、list 剖析及模拟实现 3、list 与 vector 对比 一 list 介绍及使用 List 相关文档 1、List 在任意位置进行插入和删除的序列式容器 O(1) &#xff0c;且该容器可前后双向迭代 2、List 底层是带头双向循环链表&#xff…

速通JS中的函数作用域与全局污染

函数作用域与全局污染 在 JavaScript 编程实践中&#xff0c;函数作用域和全局污染是两个核心概念&#xff0c;对代码的健壮性、可维护性及协作开发的有效性具有深远影响。函数作用域通过限制变量的访问范围来减少干扰&#xff0c;而全局污染则可能导致命名冲突和难以排查的错…

从音频到 PDF:AI 全流程打造完美英文绘本教案

今天把英文绘本的自学教案自动生成流程完成了&#xff0c;我分享一下整个实现思路&#xff0c;让你也轻松搞定英文绘本教案的产出&#xff0c;让孩子的学习之路更加顺畅。  从音频到 PDF&#xff1a;AI 全流程打造完美英文绘本教案 一、音频转文本&#xff1a;AI 助力第一步 …

(5)STM32 USB设备开发-USB键盘

讲解视频&#xff1a;2、USB键盘-下_哔哩哔哩_bilibili 例程&#xff1a;STM32USBdevice: 基于STM32的USB设备例子程序 - Gitee.com 本篇为使用使用STM32模拟USB键盘的例程&#xff0c;没有知识&#xff0c;全是实操&#xff0c;按照步骤就能获得一个STM32的USB键盘。本例子是…

初步认识操作系统(Operator System)

目录 一、概念二、设计OS的目的三、定位四、操作系统上下的分级五、如何理解 "管理"六、总结 一、概念 任何计算机系统都包含一个基本的程序集合&#xff0c;称为操作系统(OS)。操作系统包括&#xff1a; 内核&#xff08;进程管理&#xff0c;内存管理&#xff0c…