设计模式精讲 Day 7:桥接模式(Bridge Pattern)

【设计模式精讲 Day 7】桥接模式(Bridge Pattern)


文章简述

在软件系统中,类的继承关系往往会导致类爆炸,尤其是在需要组合多种功能或行为时。桥接模式(Bridge Pattern)通过将抽象部分与其实现部分分离,使得它们可以独立变化,从而有效解耦类之间的依赖关系。本文详细讲解了桥接模式的核心思想、结构组成和实现方式,并结合真实项目案例分析其应用场景。文章还深入探讨了该模式如何遵循SOLID原则,以及在Java标准库和主流框架中的实际应用。通过完整的代码示例和单元测试,帮助读者掌握如何在实际项目中灵活运用桥接模式提升系统的可扩展性和维护性。


模式定义

桥接模式(Bridge Pattern) 是一种结构型设计模式,它将一个抽象部分(Abstraction)与它的实现部分(Implementation)分离,使它们可以独立变化。该模式的核心思想是:通过组合而非继承的方式,避免类层次结构的膨胀

核心思想

  • 抽象部分定义高层操作接口。
  • 实现部分提供具体的实现逻辑。
  • 两者通过组合建立联系,而不是通过继承。

模式结构

UML类图描述(文字版)

  • Abstraction(抽象类):定义高层操作接口,包含对实现部分的引用。
  • RefinedAbstraction(扩展抽象类):对抽象类的扩展,可能添加新的操作。
  • Implementor(实现接口):定义实现部分的接口,供抽象类调用。
  • ConcreteImplementorA / B(具体实现类):实现Implementor接口的具体类。

类图关系说明:

  • Abstraction 持有 Implementor 的引用。
  • RefinedAbstraction 继承自 Abstraction,并可能扩展其功能。
  • ConcreteImplementorAConcreteImplementorB 分别实现 Implementor 接口的不同版本。

适用场景

桥接模式适用于以下情况:

场景描述
多维度变化当系统存在多个维度的变化(如不同的平台、不同的算法),且这些变化相互独立时。
避免类爆炸当使用继承导致类数量剧增时,可通过组合替代继承。
系统可扩展性要求高需要频繁增加新的实现或抽象时,桥接模式能提高系统的灵活性。

实现方式

示例:图形绘制系统

我们模拟一个图形绘制系统,支持不同形状(如圆形、方形)和不同渲染方式(如矢量图、位图)。

1. 定义实现接口(Implementor)
// 实现接口:图形渲染方式
interface Renderer {String renderShape();
}
2. 实现具体类(ConcreteImplementor)
// 矢量图渲染器
class VectorRenderer implements Renderer {@Overridepublic String renderShape() {return "Vector shape";}
}// 位图渲染器
class BitmapRenderer implements Renderer {@Overridepublic String renderShape() {return "Bitmap shape";}
}
3. 定义抽象类(Abstraction)
// 图形抽象类
abstract class Shape {protected Renderer renderer;protected Shape(Renderer renderer) {this.renderer = renderer;}abstract String draw();
}
4. 扩展抽象类(RefinedAbstraction)
// 圆形类
class Circle extends Shape {private double radius;public Circle(double radius, Renderer renderer) {super(renderer);this.radius = radius;}@OverrideString draw() {return "Circle: " + renderer.renderShape() + ", Radius: " + radius;}
}// 方形类
class Square extends Shape {private double side;public Square(double side, Renderer renderer) {super(renderer);this.side = side;}@OverrideString draw() {return "Square: " + renderer.renderShape() + ", Side: " + side;}
}
5. 使用示例
public class BridgePatternDemo {public static void main(String[] args) {// 创建两个不同的渲染器Renderer vectorRenderer = new VectorRenderer();Renderer bitmapRenderer = new BitmapRenderer();// 使用不同的渲染器创建图形Shape circleWithVector = new Circle(5, vectorRenderer);Shape squareWithBitmap = new Square(10, bitmapRenderer);// 输出结果System.out.println(circleWithVector.draw());System.out.println(squareWithBitmap.draw());}
}

输出结果:

Circle: Vector shape, Radius: 5.0
Square: Bitmap shape, Side: 10.0

工作原理

桥接模式通过将抽象部分实现部分进行解耦,使得它们可以独立变化。这种设计方式避免了传统继承带来的类爆炸问题,同时提升了系统的灵活性和可维护性。

  • 抽象类负责定义高层操作接口。
  • 实现类负责具体功能的实现。
  • 组合代替继承:抽象类不再直接依赖于具体实现,而是通过接口调用,从而降低耦合度。

优缺点分析

优点缺点
1. 解耦抽象与实现,提高可维护性。1. 增加系统复杂度,适合有一定规模的项目。
2. 支持独立变化,提高系统扩展性。2. 对于简单场景,可能会显得过于复杂。
3. 符合开闭原则,易于新增实现或抽象。4. 需要合理设计接口,否则可能导致接口臃肿。

案例分析

场景描述

某电商平台需要支持多语言商品展示,每个商品类型(如图书、电子产品)需要根据用户语言(如中文、英文)展示不同的信息格式。

问题分析

  • 如果采用继承方式,每种商品类型都需要为每种语言编写子类,导致类爆炸。
  • 不同商品类型和语言的组合过多,难以维护。

解决方案

使用桥接模式,将商品类型(抽象部分)与语言处理(实现部分)分离:

  • 抽象部分:商品类型(如Book、Electronics)
  • 实现部分:语言处理(如ChineseTranslator、EnglishTranslator)
代码实现
// 语言处理接口
interface LanguageTranslator {String translate(String content);
}// 中文翻译器
class ChineseTranslator implements LanguageTranslator {@Overridepublic String translate(String content) {return "中文:" + content;}
}// 英文翻译器
class EnglishTranslator implements LanguageTranslator {@Overridepublic String translate(String content) {return "English: " + content;}
}// 商品抽象类
abstract class Product {protected LanguageTranslator translator;public Product(LanguageTranslator translator) {this.translator = translator;}abstract String display();
}// 图书类
class Book extends Product {private String title;public Book(String title, LanguageTranslator translator) {super(translator);this.title = title;}@OverrideString display() {return translator.translate(title);}
}// 电子产品类
class Electronics extends Product {private String name;public Electronics(String name, LanguageTranslator translator) {super(translator);this.name = name;}@OverrideString display() {return translator.translate(name);}
}
使用示例
public class ProductBridgeExample {public static void main(String[] args) {LanguageTranslator chinese = new ChineseTranslator();LanguageTranslator english = new EnglishTranslator();Product book = new Book("Java编程思想", chinese);Product phone = new Electronics("iPhone", english);System.out.println(book.display()); // 中文:Java编程思想System.out.println(phone.display()); // English: iPhone}
}

与其他模式的关系

模式关系说明
组合模式相似但不同桥接模式强调“抽象”与“实现”的分离,而组合模式关注对象的层次结构。
适配器模式补充关系桥接模式用于解耦,适配器模式用于兼容不同接口。
装饰器模式可结合使用装饰器可以在桥接模式的基础上动态增强功能。
策略模式类似但用途不同策略模式用于封装算法,桥接模式用于解耦抽象与实现。

总结

本篇文章详细介绍了桥接模式的设计思想、实现方式及其在实际项目中的应用。通过将抽象部分与实现部分分离,桥接模式有效地解决了类继承带来的类爆炸问题,提高了系统的可扩展性和可维护性。

核心知识点回顾:

  • 桥接模式通过组合方式替代继承,实现抽象与实现的解耦。
  • 适用于多维度变化、类爆炸、可扩展性要求高的场景。
  • 在Java标准库中,java.awt包中的图形绘制系统也采用了桥接模式的思想。
  • 与组合、装饰器等模式有密切关联,可根据需求灵活选择。

下一篇预告

Day 8: 组合模式(Composite Pattern)

我们将深入讲解组合模式的原理与实现,了解如何构建树形结构以表示“整体-部分”关系,适用于文件系统、UI组件等场景。


文章标签

design-patterns, bridge-pattern, java, oop, software-design, architecture, java8, design-patterns-explained


进一步学习资料

  1. Design Patterns: Elements of Reusable Object-Oriented Software (GoF Book)
  2. Java Design Patterns - Bridge Pattern
  3. Bridge Pattern in Java - GeeksforGeeks
  4. Java 8 and Beyond: Design Patterns
  5. Java AWT and Swing Architecture - Bridge Pattern Example

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

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

相关文章

Apipost 签约锐捷网络:AI赋能,共推 ICT 领域 API 生态智能化升级

日前,北京北极狐信息科技有限公司(简称 “北极狐科技”)与锐捷网络股份有限公司(简称 “锐捷网络”)正式签署合作协议,双方将聚焦 ICT 基础设施及解决方案领域,围绕 API 全链路管理与智能化研发…

RK3568笔记八十三:RTMP推流H264和PCM

若该文为原创文章,转载请注明原文出处。 前面有通过勇哥,实现了RTMP推流,但一直想加上音频,所以经过测试,写了一个demo, ffmpeg是使用ubuntu下安装测试的。 安装参考:Ubuntu20.4下x264、x265、fdk-aac和FFmpeg4.3源码编译安装_ubuntu安装libx264-CSDN博客 记录:实现从…

产业园智慧化升级中 DDC 楼宇自控系统的集成应用优势:多业态协同与能源可视化管控​

摘要​ 在产业园智慧化升级浪潮中,直接数字控制(DDC)系统凭借强大的集成能力,成为实现多业态协同与能源可视化管控的核心技术。本文深入剖析 DDC 系统在整合园区多元业态、优化能源管理方面的独特优势,通过系统集成打…

Vue 3瀑布流组件实现详解 - 图片展示方案

引言:瀑布流布局的魅力与应用场景 在当今富媒体内容主导的网络环境中,瀑布流布局已成为展示图片商品等内容的流行方式。它通过动态布局算法在有限空间内最大化内容展示,提供视觉连续性和流畅浏览体验。本文将深入探讨如何使用Vue 3实现一个功…

如何确保邮件内容符合反垃圾邮件规范?

一、遵守相关法规 美国《CAN-SPAM法案》规定,邮件头信息必须真实准确,要标明广告性质、提供有效地址,并在 10 个工作日内响应退订请求。 欧盟《通用数据保护条例》(GDPR)强调获得用户明确同意,数据使用要…

MQ解决高并发下订单问题,实现流量削峰

文章目录 示例:电商秒杀系统中的流量削峰1. 依赖引入(Maven)2. 消息队列配置(RabbitMQ)3. 生产者:订单服务(接收高并发请求)4. 消费者:库存服务(按系统容量处…

【二进制安全作业】250616课上作业2 - 栈溢出漏洞利用

文章目录 前言一、使用环境二、程序源码1. C语言源码2. 编译方式 三、源码分析四、反汇编分析1. 检查文件安全性2. 查找目标函数3. 计算偏移量4. 绕过 strlen5. 绕过 if 五、编写EXP结语 前言 直接进入正题 一、使用环境 处理器架构:x86_64 操作系统:U…

Python类型处理与推导式

欢迎来到啾啾的博客🐱。 记录学习点滴。分享工作思考和实用技巧,偶尔也分享一些杂谈💬。 有很多很多不足的地方,欢迎评论交流,感谢您的阅读和评论😄。 目录 1 引言2 类型处理3 高效操作AI开发常见数据结构3…

数据库char字段做trim之后查询很慢的解决方式

select * from TABLE0 where trim(column1):param 当表数据量大时,即使给column1字段加上索引,这条查询语句也会很慢。 因为使用trim函数后,column1的索引会失效,有两种处理方法: 1.给表加上trim(column1)函数索引 …

Kafka核心架构解析:从CAP理论到消息可靠性的设计哲学

摘要 本文从分布式系统CAP理论和消息可靠性两个视角深入解析Kafka的架构设计,通过概念关系图和组件交互图揭示其核心设计思想,并详细拆解各组件功能与协作机制。文章包含完整的交互流程分析和配置参数说明,是理解Kafka设计精髓的实用指南。 一…

LeetCode 275.H指数 II

题目: 给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数,citations 已经按照 非降序排列 。计算并返回该研究者的 h 指数。 h 指数的定义:h 代表“高引用次数”(high citations&…

OV汽车摄像头cmos sensor 相关情况介绍

OV汽车摄像头cmos sensor 相关情况介绍 文章目录 OV汽车摄像头cmos sensor 相关情况介绍**1. 汽车摄像头三大场景应用****2. 车载CMOS SENSOR的核心技术****3. 两大车规认证:实现真正的车规可靠性****4. 最新产品**2022年,汽车智能化加码提速,被誉为“智能驾驶之眼”的车载摄…

Pinia在多步骤表单中的实践应用

引言 Pinia是Vue 3推荐的状态管理库,相比Vuex提供了更简洁的API、更好的TypeScript支持和更灵活的组合式风格。本文基于实际项目代码,详细介绍Pinia在多步骤表单场景中的应用方法。 1. Pinia Store的创建与设计 1.1 基础Store结构 在src/store/modul…

目标检测之YOLOV11的环境搭建

1 创建虚拟环境 conda create -n yolov11 python3.9 conda activate yolov112 安装ultralytics 默认是有cuda的情况下 # Install all packages together using conda conda install pytorch torchvision conda 还不能直接安装ultralytics,需要通过pip进行安装 …

Android 构建配置中的变量(通常在设备制造商或定制 ROM 的 AndroidProducts.mk 或产品配置文件中定义)

以下是 Android 构建系统中常见的用于产品配置、资源复制和构建规则的变量 1. PRODUCT_COPY_FILES 作用:指定需要从源码树复制到镜像的文件。示例:PRODUCT_COPY_FILES \device/manufacturer/device_name/file.conf:$(TARGET_COPY_OUT_VENDOR)/etc/file…

火山引擎项亮:机器学习与智能推荐平台多云部署解决方案正式发布

资料来源:火山引擎-开发者社区 2022年7月20日,火山引擎2022 Force原动力大会在北京诺金酒店成功举办。在上午的议程中,《推荐系统实践》一书的作者、同时也是火山引擎机器学习系统负责人——项亮,展开了题目为《开放AI基建&#x…

NVR的方法多种取决于应用场景

摄像头接入NVR(网络视频录像机)的方法通常取决于具体的应用场景和设备支持的功能。 一、通过局域网接入 设备连接 : 将摄像机通过网络线缆连接到NVR的对应端口,或者将摄像机和NVR都连接到同一个路由器/交换机上,确保它…

JAVA从入门到精通一文搞定

博主介绍: 大家好,我是想成为Super的Yuperman,互联网宇宙厂经验,17年医疗健康行业的码拉松奔跑者,曾担任技术专家、架构师、研发总监负责和主导多个应用架构。 近期专注: DeepSeek应用,RPA应用研…

火山引擎发布大模型生态广场MCP Servers,LAS MCP助力AI数据湖构建

资料来源:火山引擎-开发者社区 近日,火山引擎发布大模型生态广场—— MCP Servers,借助字节跳动生态能力,通过“MCP Market(工具广场) 火山方舟(大模型服务)Trae(应用开…

NodeJS 对接 Outlook 发信服务器实现发信功能

示例代码: const express require(express); const nodemailer require(nodemailer); const querystring require(querystring); const axios require(axios);const app express(); app.use(express.json());const transporter nodemailer.createTransport({…