桥接模式 Bridge Pattern

桥接模式Abstraction Implementor 的理解

在图书馆看到一本 通过电商项目真正实战《贯穿设计模式》。拿起来翻到了 桥接模式,感觉味道不对,和我印象中不一样。

感谢这位同学提供的源码

贯穿设计模式-适配器模式+桥接模式_-CSDN博客GitHub - WeiXiao-Hyy/design-patterns: 《贯穿设计模式》学习笔记

Clone下来生成如下 Class Diagram。

和wikipedia 上的 桥接模式类图(下图),对比一下就发现,书的作者对桥接模式的运用有点儿“独特风格”。似乎认为 abstraction 和 implementor 是同一个纬度,而同一纬度并不适合桥接模式。

Abstraction (abstract class)  【(抽象类)】

        defines the abstract interface 【定义抽象的接口】

        maintains the Implementor reference.  【持有一个Implementor 的引用】

RefinedAbstraction (normal class)    【(普通类)】

        extends the interface defined by Abstraction  【扩展了 Abstraction 功能】

Implementor (interface)      【实施者(接口)】

        defines the interface for implementation classes  【给 ConcreteImplementor 定义接口】

ConcreteImplementor (normal class)    【具体实施者(普通类)】

        implements the Implementor interface 【实现 Implementor 接口】

刚接触的桥接模式时,觉得很难理解,现在想想其实是对  Abstraction 和 Implementor 的理解出了问题。

DeepSeek 给的解释是:

  • 抽象类(Abstraction):定义高层逻辑,并持有一个对实现类的引用。

  • 扩展抽象类(Refined Abstraction):对抽象类的扩展,通常增加更多的功能。

  • 实现类接口(Implementor):定义实现部分的接口,抽象类通过该接口调用具体的实现。

  • 具体实现类(Concrete Implementor):实现实现类接口,提供具体的实现细节。

第一次看了,会不会觉得这里的 “实现类 Implementor” 就是这里 “抽象类 Abstraction” 的实现呢!如果这么认为就无法理解 bridge pattern了。并非java中的抽象类和实现类。

Abstraction 和 Implementor 的关系

  • 分离抽象与实现:Abstraction 和 Implementor 是两个独立的维度,Abstraction 依赖于 Implementor 的接口,但不需要知道具体的实现细节。

  • 组合关系:Abstraction 通过组合的方式持有一个 Implementor 的引用,并将具体的操作委托给 Implementor。

  • 独立变化:Abstraction 和 Implementor 可以独立扩展和修改,而不会相互影响。

对的,是组合关系,并非继承 🤣,而且是两个纬度。

这里推荐 设计模式之桥接模式(Bridge)-CSDN博客 中的支付工具和支付方式的例子。

来看一个 Pizza 的例子

在一个地方,开了一家Pizza店, 有两个不同的口味。

        PepperoniPizza extends Pizza 

        VeggiePizza extends Pizza

生意不错,分别在美国和意大利开了店,根据店铺 和 口味,两个维度,扩展到 4个 Pizza 实现。

        ItalianVeggiePizza extends Pizza

        ItalianPepperoniPizza extends Pizza

        AmericanVeggiePizza extends Pizza

        AmericanPepperoniPizza extends Pizza

后续如果增加 Chicken Pizza,则要同时增加两种实现。 无法相信随着口味和店铺的扩增,将会成倍增长。

导致此问题的原因是我们尝试从两个不同的维度扩展 pizza 。解决此问题则需要采用 组合(composition) 而非 继承(inheritance)。

也就是说需要,提取其中一个纬度,采用不同的 class hierarchy。原有的class持有新的 hierarchy 的引用。

通过这种方式,我们需要 定义 Restaurant abstract class,提供 ItalianRestaurant 和 AmericanRestaurant 两个实现类。Pizza 对象引用则被 Restaurant 持有,来充当 bridge。

AmericanRestaurant americanRestaurant = new AmericanRestaurant(new PepperoniPizza());
americanRestaurant.deliver();ItalianRestaurant italianRestaurant = new ItalianRestaurant(new VeggiePizza());
italianRestaurant.deliver();

DeepSeek给出的解释 

桥接模式(Bridge Pattern)是一种结构型设计模式,旨在将抽象部分与实现部分分离,使它们可以独立变化。为了更好地理解桥接模式,可以从以下几个方面入手:

1. 核心思想

桥接模式的核心在于解耦。它将抽象部分(通常是高层逻辑)与实现部分(通常是底层细节)分离,使它们可以独立扩展和修改,而不会相互影响。

2. 适用场景

  • 当你有多个维度的变化时,桥接模式可以帮助你避免类爆炸问题。

  • 当你希望抽象部分和实现部分可以独立扩展时。

  • 当你希望在运行时切换实现部分时。

3. 结构

桥接模式通常包含以下角色:

  • 抽象类(Abstraction):定义高层逻辑,并持有一个对实现类的引用。

  • 扩展抽象类(Refined Abstraction):对抽象类的扩展,通常增加更多的功能。

  • 实现类接口(Implementor):定义实现部分的接口,抽象类通过该接口调用具体的实现。

  • 具体实现类(Concrete Implementor):实现实现类接口,提供具体的实现细节。

4. 示例

假设你有一个图形绘制系统,支持多种形状(如圆形、矩形)和多种颜色(如红色、蓝色)。如果不使用桥接模式,你可能需要为每种形状和颜色的组合创建一个类(如红色圆形、蓝色矩形等),这会导致类爆炸。

使用桥接模式,你可以将形状和颜色分离:

  • 抽象类:形状(Shape)

  • 扩展抽象类:圆形(Circle)、矩形(Rectangle)

  • 实现类接口:颜色(Color)

  • 具体实现类:红色(Red)、蓝色(Blue) 

// 实现类接口
interface Color {void applyColor();
}// 具体实现类
class Red implements Color {@Overridepublic void applyColor() {System.out.println("Applying red color");}
}class Blue implements Color {@Overridepublic void applyColor() {System.out.println("Applying blue color");}
}// 抽象类
abstract class Shape {protected Color color;public Shape(Color color) {this.color = color;}abstract void draw();
}// 扩展抽象类
class Circle extends Shape {public Circle(Color color) {super(color);}@Overridevoid draw() {System.out.print("Drawing Circle: ");color.applyColor();}
}class Rectangle extends Shape {public Rectangle(Color color) {super(color);}@Overridevoid draw() {System.out.print("Drawing Rectangle: ");color.applyColor();}
}// 客户端代码
public class BridgePatternDemo {public static void main(String[] args) {Shape redCircle = new Circle(new Red());Shape blueRectangle = new Rectangle(new Blue());redCircle.draw();blueRectangle.draw();}
}

5. 优点

  • 解耦:抽象和实现可以独立变化,互不影响。

  • 扩展性:可以轻松扩展新的抽象类或实现类。

  • 减少类爆炸:避免了为每个组合创建单独的类。

6. 缺点

  • 复杂性增加:引入了更多的类和接口,增加了系统的复杂性。

  • 理解难度:对于初学者来说,桥接模式可能较难理解。

7. 与其他模式的关系

  • 与适配器模式:适配器模式通常用于使不兼容的接口兼容,而桥接模式用于将抽象与实现分离。

  • 与策略模式:策略模式侧重于算法的替换,而桥接模式侧重于抽象与实现的分离。

8. 总结

桥接模式通过将抽象与实现分离,提供了一种灵活的方式来处理多维度的变化。理解桥接模式的关键在于认识到它的解耦思想,并通过实际例子来体会其应用场景和优势。

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

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

相关文章

gitee SSH 公钥设置教程

Gitee 提供了基于 SSH 协议的 Git 服务,在使用 SSH 协议访问仓库仓库之前,需要先配置好账户 SSH 公钥。 1、生成秘钥 Windows 用户建议使用 Windows PowerShell 或者 Git Bash,在 命令提示符 下无 cat 和 ls 命令。 ssh-keygen -t ed25519 -C "Gitee SSH Key"中间…

jenkins war Windows安装

Windows安装Jenkins 需求1.下载jenkins.war2.编写快速运行脚本3.启动Jenkins4.Jenkins使用 需求 1.支持在Windows下便捷运行Jenkins; 2.支持自定义启动参数; 3.有快速运行的脚步样板。 1.下载jenkins.war Jenkins下载地址:https://get.j…

string类详解(上)

文章目录 目录1. STL简介1.1 什么是STL1.2 STL的版本1.3 STL的六大组件 2. 为什么学习string类3. 标准库中的string类3.1 string类3.2 string类的常用接口说明 目录 STL简介为什么学习string类标准库中的string类string类的模拟实现现代版写法的String类写时拷贝 1. STL简介 …

[数据结构]红黑树,详细图解插入

目录 一、红黑树的概念 二、红黑树的性质 三、红黑树节点的定义 四、红黑树的插入(步骤) 1.为什么新插入的节点必须给红色? 2、插入红色节点后,判定红黑树性质是否被破坏 五、插入出现连续红节点情况分析图解(看…

java练习(28)

ps:练习来自力扣 给定一个二叉树,判断它是否是平衡二叉树 // 定义二叉树节点类 class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) { this.val val; }TreeNode(int val, TreeNode left, TreeNode right) {this.va…

Java并发编程6--重排序

重排序是指 编译 器和 处 理器 为 了 优 化程序性能而 对 指令序列 进 行重新排序的一种手段。 1.数据依赖性 如果两个操作 访问 同一个 变 量,且 这 两个操作中有一个 为 写操作,此 时这 两个操作之 间就存在数据 依赖性。 数据依赖的类型 上面 3 种情…

ElasticSearch映射分词

目录 弃用Type why 映射 查询 mapping of index 创建 index with mapping 添加 field with mapping 数据迁移 1.新建 一个 index with correct mapping 2.数据迁移 reindex data into that index 分词 POST _analyze 自定义词库 ik分词器 circuit_breaking_excep…

Python 面向对象的三大特征

前言:本篇讲解面向对象的三大特征(封装,继承,多态),还有比较细致的(类属性类方法,静态方法),分步骤讲解,比较适合理清楚三大特征的思路 面向对象的…

deepseek多列数据对比,联想到excel的高级筛选功能

目录 1 业务背景 ​2 deepseek提示词输入 ​3 联想分析 4 EXCEL高级搜索 1 业务背景 系统上线的时候经常会遇到一个问题,系统导入的数据和线下的EXCEL数据是否一致,如果不一致,如何快速找到差异值,原来脑海第一反应就是使用公…

俄罗斯方块游戏完整代码示例

以下是一个基于Cocos Creator引擎开发的俄罗斯方块游戏的完整代码示例。该游戏实现了俄罗斯方块的基本功能,并且代码整合在单个文件中,无需任何外部依赖,可以直接在浏览器中运行。 1. 创建Cocos Creator项目 首先,确保你已经安装了…

java后端开发day16--字符串(二)

(以下内容全部来自上述课程) 1.StringBuilder 因为StringBuilder是Java已经写好的类。 java在底层对他进行了一些特殊处理。 打印对象不是地址值而是属性值。 1.概述 StringBuilder可以看成是一个容器,创建之后里面的内容是可变的。 作用…

【AI实践】deepseek支持升级git

当前Windows 11 WSL的git是2.17,Android Studio提示需要升级到2.19版本 网上找到指导文章 安装git 2.19.2 cd /usr/src wget https://www.kernel.org/pub/software/scm/git/git-2.19.2.tar.gz tar xzf git-2.19.2.tar.gz cd git-2.19.2 make prefix/usr/l…

从零复现R1之路[3/3]:一文速览Open R1——对DeepSeek R1训练流程前两个阶段的复现(SFT和GRPO训练)

前言 根据R1的GitHub可知 类别开源内容未开源内容模型权重R1、R1-Zero 及蒸馏模型权重(MIT 协议)原始训练数据 未公开冷启动数据、RL 训练数据集或合成数据的具体内容,仅提供依赖的公开数据集名称(如 AI-MO、NuminaMath-TIR&…

大语言模型简史:从Transformer(2017)到DeepSeek-R1(2025)的进化之路

2025年初,中国推出了具有开创性且高性价比的「大型语言模型」(Large Language Model — LLM)DeepSeek-R1,引发了AI的巨大变革。本文回顾了LLM的发展历程,起点是2017年革命性的Transformer架构,该架构通过「…

在线考试系统(代码+数据库+LW)

摘 要 使用旧方法对在线考试系统的信息进行系统化管理已经不再让人们信赖了,把现在的网络信息技术运用在在线考试系统的管理上面可以解决许多信息管理上面的难题,比如处理数据时间很长,数据存在错误不能及时纠正等问题。这次开发的在线考试…

2025百度快排技术分析:模拟点击与发包算法的背后原理

一晃做SEO已经15年了,2025年还有人问我如何做百度快速排名,我能给出的答案就是:做好内容的前提下,多刷刷吧!百度的SEO排名算法一直是众多SEO从业者研究的重点,模拟算法、点击算法和发包算法是百度快速排名的…

【Spring+MyBatis】留言墙的实现

目录 1. 添加依赖 2. 配置数据库 2.1 创建数据库与数据表 2.2 创建与数据库对应的实体类 3. 后端代码 3.1 目录结构 3.2 MessageController类 3.3 MessageService类 3.4 MessageMapper接口 4. 前端代码 5. 单元测试 5.1 后端接口测试 5.2 使用前端页面测试 在Spri…

EtherNet/IP转Modbus TCP:新能源风电监控与分析实用案例

EtherNet/IP转Modbus TCP:新能源风电监控与分析实用案例 一、案例背景 在某新能源汽车电池生产线上,需要将采用EtherNet/IP协议的电池检测设备与采用ProfiNet协议的生产线控制系统进行集成,以实现对电池生产过程的全面监控和数据采集。 二、…

管理WSL实例 以及安装 Ubuntu 作为 WSL 子系统 流程

安装ubuntu wsl --install -d Ubuntu分类命令说明安装相关wsl --install在 Windows 10/11 上以管理员身份在 PowerShell 中运行此命令&#xff0c;可安装 WSLwsl --install -d <distribution name>在 PowerShell 中使用此命令安装特定版本的 Linux 发行版&#xff0c;如…

Spring框架中都用到了哪些设计模式?

大家好&#xff0c;我是锋哥。今天分享关于【Spring框架中都用到了哪些设计模式&#xff1f;】面试题。希望对大家有帮助&#xff1b; Spring框架中都用到了哪些设计模式&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring框架中使用了大量的设计模…