news 2026/5/1 11:45:12

设计模式——桥接模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
设计模式——桥接模式

桥接模式 (Bridge Pattern)

什么是桥接模式?

桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立地变化。

简单来说:桥接模式就是将抽象和实现解耦,让它们可以独立变化。

生活中的例子

想象一下:

  • 遥控器与电视:遥控器是抽象,电视是实现,它们可以独立变化
  • 形状与颜色:形状是抽象,颜色是实现,它们可以独立组合
  • 操作系统与文件系统:操作系统是抽象,文件系统是实现

为什么需要桥接模式?

传统方式的问题

// 如果使用继承,会导致类爆炸classRedCircle{}classGreenCircle{}classBlueCircle{}classRedSquare{}classGreenSquare{}classBlueSquare{}// ... 更多组合

问题

  1. 类爆炸:多个维度组合会导致类数量爆炸
  2. 扩展困难:新增一个维度需要创建多个类
  3. 耦合度高:抽象和实现紧密耦合

桥接模式的优势

// 使用桥接模式,抽象和实现独立变化Shapeshape=newCircle(newRed());shape.draw();

优势

  1. 解耦合:抽象和实现解耦
  2. 独立变化:抽象和实现可以独立变化
  3. 扩展容易:新增抽象或实现都很容易

桥接模式的结构

┌─────────────────────┐ │ Abstraction │ 抽象 ├─────────────────────┤ │ - impl: Implementor │ │ + operation(): void │ └──────────┬──────────┘ │ 继承 │ ┌──────────┴──────────┐ │ RefinedAbstraction │ 扩展抽象 ├─────────────────────┤ │ + operation(): void │ └─────────────────────┘ ┌─────────────────────┐ │ Implementor │ 实现接口 ├─────────────────────┤ │ + operationImpl(): void│ └──────────┬──────────┘ │ 实现 ├──┬──────────────────┬──────────────┐ │ │ │ ┌──────────┴──────┐ ┌───────────┴───────┐ ┌───┴────────┐ │ ConcreteImpl1 │ │ ConcreteImpl2 │ │ ... │ 具体实现 └─────────────────┘ └───────────────────┘ └────────────┘

代码示例

1. 定义实现接口

/** * 实现接口:颜色 */publicinterfaceColor{/** * 应用颜色 */voidapplyColor();}

2. 定义具体实现

/** * 具体实现:红色 */publicclassRedimplementsColor{@OverridepublicvoidapplyColor(){System.out.println("应用红色");}}/** * 具体实现:蓝色 */publicclassBlueimplementsColor{@OverridepublicvoidapplyColor(){System.out.println("应用蓝色");}}/** * 具体实现:绿色 */publicclassGreenimplementsColor{@OverridepublicvoidapplyColor(){System.out.println("应用绿色");}}

3. 定义抽象

/** * 抽象:形状 */publicabstractclassShape{protectedColorcolor;publicShape(Colorcolor){this.color=color;}/** * 绘制形状 */publicabstractvoiddraw();}

4. 定义扩展抽象

/** * 扩展抽象:圆形 */publicclassCircleextendsShape{publicCircle(Colorcolor){super(color);}@Overridepublicvoiddraw(){System.out.print("绘制圆形,");color.applyColor();}}/** * 扩展抽象:正方形 */publicclassSquareextendsShape{publicSquare(Colorcolor){super(color);}@Overridepublicvoiddraw(){System.out.print("绘制正方形,");color.applyColor();}}

5. 使用桥接

/** * 桥接模式测试类 * 演示如何使用桥接模式将抽象与实现分离 */publicclassBridgeTest{publicstaticvoidmain(String[]args){System.out.println("=== 桥接模式测试 ===\n");// 创建不同颜色的形状System.out.println("--- 红色圆形 ---");ShaperedCircle=newCircle(newRed());redCircle.draw();System.out.println("\n--- 蓝色正方形 ---");ShapeblueSquare=newSquare(newBlue());blueSquare.draw();System.out.println("\n--- 绿色圆形 ---");ShapegreenCircle=newCircle(newGreen());greenCircle.draw();System.out.println("\n--- 红色正方形 ---");ShaperedSquare=newSquare(newRed());redSquare.draw();System.out.println("\n=== 桥接模式的优势 ===");System.out.println("1. 解耦合:抽象和实现解耦");System.out.println("2. 独立变化:抽象和实现可以独立变化");System.out.println("3. 扩展容易:新增抽象或实现都很容易");System.out.println("4. 减少类数量:避免类爆炸");System.out.println("\n=== 实际应用场景 ===");System.out.println("场景:不同形状和不同颜色的组合");System.out.println("如果不使用桥接模式,需要创建:");System.out.println(" - RedCircle, BlueCircle, GreenCircle");System.out.println(" - RedSquare, BlueSquare, GreenSquare");System.out.println(" - ... 更多组合");System.out.println("使用桥接模式,只需要:");System.out.println(" - 3种颜色:Red, Blue, Green");System.out.println(" - 2种形状:Circle, Square");System.out.println(" - 可以任意组合,共 3×2=6 种组合");}}

桥接模式的优点

  1. 解耦合:抽象和实现解耦
  2. 独立变化:抽象和实现可以独立变化
  3. 扩展容易:新增抽象或实现都很容易
  4. 减少类数量:避免类爆炸

桥接模式的缺点

  1. 增加复杂度:引入了额外的抽象层
  2. 理解困难:增加了系统的理解难度

适用场景

  1. 多个维度:系统有多个独立的维度
  2. 避免类爆炸:需要避免因继承导致的类爆炸
  3. 独立变化:抽象和实现需要独立变化

常见应用场景

  • UI框架:窗口与控件
  • 数据库驱动:数据库与驱动
  • 跨平台开发:平台与功能

使用建议

  • 多个维度:使用桥接模式
  • 避免类爆炸:使用桥接模式
  • 单一维度:直接使用继承即可

注意事项

⚠️ 桥接模式虽然强大,但要注意:

  • 只有在多个维度时才使用
  • 不要过度设计,增加不必要的复杂度
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 4:56:16

看似平平无奇的00后,居然一跃上岸字节,表示真的卷不过......

又到了一年一度的求职旺季金!三!银!四!在找工作的时候都必须要经历面试这个环节。在这里我想分享一下自己上岸字节的面试经验,过程还挺曲折的,但是还好成功上岸了。大家可以参考一下! 0821测评 …

作者头像 李华
网站建设 2026/5/1 4:57:37

CAS入门

一、先搞懂:为什么需要CAS? 在讲CAS之前,我们先解决一个基础问题:并发场景下,简单的自增操作(比如i)为什么会出问题? 举个例子:你有一个变量int count 0,让1…

作者头像 李华
网站建设 2026/5/1 6:11:13

Dify:一站式AI应用开发平台全解析与Windows部署指南

从零到一,掌握这款让AI应用开发效率提升10倍的开源神器 🎯 什么是Dify? Dify(发音为 /ˈdɪfaɪ/)是一个开源的生成式AI应用开发平台,旨在帮助开发者和企业快速构建并部署生产级的AI应用。它的核心是融合了…

作者头像 李华
网站建设 2026/5/1 5:01:27

怎样用Postman做接口自动化测试及完美的可视化报告

postman官网下载地址: https://www.postman.com/downloads/ 下载后直接双击文件安装: Postman-win64-9.20.3-Setup.exe 根据自己需要修改软件安装路径,后面直接默认安装就可以 1、Jenkins简介 Jenkins是一个开源的软件项目,…

作者头像 李华
网站建设 2026/5/1 8:37:03

校招失败后,在小公司熬了 2 年终于进了百度,竭尽全力....

其实两年前校招的时候就往百度投了一次简历,结果很明显凉了,随后这个理想就被暂时放下了,但是这个种子一直埋在心里这两年除了工作以外,也会坚持写博客,也因此结识了很多优秀的小伙伴,从他们身上学到了特别…

作者头像 李华
网站建设 2026/5/1 8:37:32

卷麻了,00后测试用例写的比我还好,简直无地自容......

经常看到无论是刚入职场的新人,还是工作了一段时间的老人,都会对编写测试用例感到困扰?例如: 如何编写测试用例? 作为一个测试新人,刚开始接触测试,对于怎么写测试用例很是头疼,无法…

作者头像 李华