结构型模式-桥接模式

桥接模式是什么

     桥接模式是一种结构型设计模式,用于将抽象部分和其具体实现部分解耦,使它们可以独立变化。该模式通过将抽象和实现部分分离,使它们可以独立地扩展和变化。

在桥接模式中,有两个关键角色:抽象部分和实现部分。抽象部分定义了高层的抽象接口,包含了一些操作方法,而实现部分则实现了抽象部分的接口。通过桥接模式,可以轻松地在两个角色之间进行切换和扩展。

桥接模式主要解决了多层继承的问题。在传统的继承关系中,父类与其子类之间存在着强耦合关系,并且随着层次的增加,继承关系会变得越来越复杂。而桥接模式通过将继承关系改为聚合关系,将复杂的继承关系转变为简单的关联关系,降低了系统的复杂性并提高了灵活性。

桥接模式优缺点

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

优点:

  1. 分离抽象和实现部分,使它们可以独立地扩展和变化,增强了代码的灵活性。
  2. 可以在运行时动态改变抽象和实现部分的关联关系。
  3. 提高了系统的可扩展性和可维护性,因为抽象部分和实现部分的变化不会相互影响。

缺点:

  1. 增加了系统的复杂性,因为需要定义抽象接口和实现类,以及它们之间的关联关系。
  2. 增加了系统的理解和学习成本,因为需要理解和掌握桥接模式的概念和使用方法。

桥接模式应用场景

      

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

  1. 当一个类存在两个或多个独立变化的维度时,可以使用桥接模式。这些维度可以通过不同的层次进行扩展。

  2. 当一个类不希望与其它类产生耦合关系,可以使用桥接模式。通过将抽象部分和实现部分分离,可以独立地对它们进行扩展。

  3. 当一个类需要通过多个维度进行变化,可以使用桥接模式。通过桥接模式可以避免类的膨胀。

  4. 当一个类需要在运行时切换不同的实现,可以使用桥接模式。通过运行时的动态绑定,可以选择不同的实现。

  5. 当一个类需要在多个平台上使用不同的实现,可以使用桥接模式。通过桥接模式可以方便地切换不同的实现。

代码示例

// 实现部分接口
interface DrawingAPI {void drawCircle(double x, double y, double radius);
}// 具体的实现部分
class DrawingAPI1 implements DrawingAPI {@Overridepublic void drawCircle(double x, double y, double radius) {System.out.printf("API1.circle at %f:%f radius %f%n", x, y, radius);}
}// 具体的实现部分
class DrawingAPI2 implements DrawingAPI {@Overridepublic void drawCircle(double x, double y, double radius) {System.out.printf("API2.circle at %f:%f radius %f%n", x, y, radius);}
}// 抽象部分
abstract class Shape {protected DrawingAPI drawingAPI;protected Shape(DrawingAPI drawingAPI) {this.drawingAPI = drawingAPI;}public abstract void draw();public abstract void resizeByPercentage(double pct);
}// 具体的抽象部分
class CircleShape extends Shape {private double x, y, radius;public CircleShape(double x, double y, double radius, DrawingAPI drawingAPI) {super(drawingAPI);this.x = x;this.y = y;this.radius = radius;}@Overridepublic void draw() {drawingAPI.drawCircle(x, y, radius);}@Overridepublic void resizeByPercentage(double pct) {radius *= (1.0 + pct/100.0);}
}public class BridgePatternExample {public static void main(String[] args) {Shape circleShape1 = new CircleShape(1, 2, 3, new DrawingAPI1());Shape circleShape2 = new CircleShape(5, 7, 11, new DrawingAPI2());circleShape1.resizeByPercentage(2.5);circleShape2.resizeByPercentage(4.5);circleShape1.draw();circleShape2.draw();}
}

在上面的示例中,我们首先定义了一个接口DrawingAPI,它声明了一个drawCircle方法。然后我们实现了两个具体的实现类DrawingAPI1DrawingAPI2,它们分别实现了drawCircle方法来绘制圆。

接下来,我们定义了一个抽象类Shape,它包含一个对DrawingAPI的引用,并且声明了drawresizeByPercentage方法。

最后,我们定义了一个具体的类CircleShape,它继承自Shape,并且实现了drawresizeByPercentage方法。在draw方法中,我们调用了drawingAPIdrawCircle方法来绘制圆。

在应用程序的入口点中,我们创建了两个CircleShape对象,并且调用了resizeByPercentage方法来调整圆的大小。然后我们调用draw方法来绘制圆。

这个例子中,CircleShape是抽象部分,DrawingAPI是实现部分。通过将抽象部分和实现部分分离,我们可以独立地对它们进行扩展和变化,增强了灵活性和可维护性。

总结

   

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

在桥接模式中,抽象部分和实现部分各自有自己的抽象类和实现类。抽象部分中的方法依赖于实现部分的接口,通过桥接模式,可以在运行时将不同的实现部分动态地注入到抽象部分中。

桥接模式的关键角色包括抽象类(Abstraction)、具体抽象类(ConcreteAbstraction)、实现类接口(Implementor)和具体实现类(ConcreteImplementor)。

通过桥接模式,我们可以轻松地扩展和变化抽象部分和实现部分,而且它们可以独立地变化,互不影响。这使得桥接模式非常适用于应对多样化的需求和变化。

总结一下桥接模式的优点:

  1. 分离抽象部分和实现部分,使它们可以独立变化。
  2. 提高了系统的可扩展性,可灵活地增加新的抽象类和实现类。
  3. 对客户端隐藏了具体实现,使客户端只关注抽象部分。

然而,桥接模式也有一些缺点:

  1. 增加了系统的复杂性,因为需要定义抽象部分和实现部分的接口和实现类。
  2. 桥接模式可能会导致系统中存在大量的类和对象,增加了系统的维护难度。

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

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

相关文章

LLMs:《A Decoder-Only Foundation Model For Time-Series Forecasting》的翻译与解读

LLMs:《A Decoder-Only Foundation Model For Time-Series Forecasting》的翻译与解读 导读:本文提出了一种名为TimesFM的时序基础模型,用于零样本学习模式下的时序预测任务。 背景痛点:近年来,深度学习模型在有充足训…

云计算在保险行业的应用:太平财险团财险理赔新核心业务系统案例

随着科技的快速发展,云计算技术已经成为推动保险行业数字化转型的重要力量。云计算为保险公司提供了弹性、可扩展的计算资源,使其能够灵活应对业务高峰和低谷,提高业务运营效率和风控水平。太平财险与太平金科联合开发的“团财险理赔新核心业…

PCA与LDA

共同点 降维方法: PCA和LDA都是数据降维的方式,它们都能通过某种变换将原始高维数据投影到低维空间。 数学原理: 两者在降维过程中都使用了矩阵特征分解的思想,通过对数据的协方差矩阵或类间、类内散度矩阵进行特征分解&#xff…

STM32 使用硬件SPI读写W25Q64芯片

STM32使用硬件SPI读写W25Q64芯片 摘要 本文详细介绍了如何使用STM32微控制器的硬件SPI接口来读写W25Q64串行Flash存储器。W25Q64是一款8Mb的SPI Flash存储器,广泛应用于嵌入式系统中。本文将从硬件连接、SPI初始化、W25Q64初始化、读写操作等方面进行阐述&#xf…

分析开封办理建筑工程设计资质流程

了解资质标准:查阅最新的建筑工程设计资质管理规定,明确申请所需的具体条件,包括注册资本、专业技术人员配备、技术装备、质量管理体系、工程业绩等要求。 组建符合资质要求的团队:招聘或调配具备相应资格的专业技术人员&#xf…

MySQL的复制和集群技术

MySQL的复制和集群技术是提升数据库性能、确保数据冗余和增强数据库可用性的重要手段。以下是关于MySQL复制和集群技术的详细解释: 1. MySQL复制(Replication) 1.1 定义 MySQL复制是一种将数据从一个MySQL数据库服务器(称为主服…

【Python高级编程】Python中文本文件操作的基本方法

Python操作文本文件详解 在Python编程中,操作文本文件是一个非常常见的需求。无论是读取文件内容进行数据处理,还是将结果写入文件保存记录,文本文件的操作技巧都非常重要。本篇博客将详细介绍如何使用Python进行文本文件的操作,…

JAVA开发 选择指定的文件生成ZIP压缩包

JAVA开发 选择指定的文件生成ZIP压缩包 1、ZipOutputStream1.1 主要方法1.2 使用步骤 2、案例实现2.1 代码块2.2 运行界面 1、ZipOutputStream ZipOutputStream 是 Java 中的一个类,它属于 java.util.zip 包,用于将多个文件或数据流写入到一个 ZIP 输出…

【mysql为什么采用b+树作为索引】

## 1、Hash: 它查询任何一行数据都只需一次IO,但是只能查一行,不能查询范围 。 ## 2、二叉树: 1、 可能会单边增长,退化成链表,查询效率和没建立索引差不多。2、才二叉而已,树的层数太多,IO次数多&#x…

数据赋能(121)——体系:数据清洗——实施过程、应用特点

实施过程 数据清洗的实施过程是一个复杂而关键的任务,它涉及多个步骤以确保数据的准确性和一致性。以下是数据清洗通常需要进行的操作包括: 纠正错误: 识别和纠正数据中的错误,如拼写错误、编码错误、计算错误等。对于某些数据&…

贪心算法学习五

例题一 解法(贪⼼): 贪⼼策略: 我们的任何选择,应该让这个数尽可能快的变成 1 。 对于偶数:只能执⾏除 2 操作,没有什么分析的; 对于奇数: i. 当 n 1 的时候…

Docker 安装 MySQL5.7 和 MySQL8

文章目录 安装 MySQL5.7拉取镜像前期准备启动容器 安装MySQL8.0拉取镜像查看镜像前期准备启动容器 安装 MySQL5.7 拉取镜像 docker pull mysql:5.7拉下来镜像后 执行 docker images 此时我们已经有这个镜像了。 前期准备 在根目录下创建 app , 在 app 目录下创建…

使用 `millis()` 函数在 Arduino 编程中实现非阻塞延时(水泵/继电器不受控制为例)

在 Arduino 编程中,delay() 函数是一个常见的工具,用于创建代码执行的延时。然而,delay() 函数的一个显著缺点是它会阻塞代码的执行。这意味着当 delay() 函数运行时,Arduino 将暂停其他所有的操作,直到延时结束。这种…

小工具开发

因不太喜欢重复性工作,为了提高日常工作效率,在业余时间开发一些小工具用于帮助自己“偷懒”。 小工具功能: 1、Hightec编译的hex文件,与多模式标定hex文件合成 2、Bootloader文件,Hightec编译的hex文件,与…

Oracle 系列数据库使用 listagg去重,删除重复数据的几种方法

listagg聚合之后很多重复数据,下面是解决重复数据问题 案例表 create table "dept_tag_info" ( "tag_id" bigint not null, "tag_code" varchar(200), "tag_name" varchar(500), "tag_level" varchar(200), &…

java-接口 2

### 7. 接口的设计原则 #### 7.1 接口隔离原则(ISP) 接口隔离原则(Interface Segregation Principle, ISP)建议将大的接口分解为多个小接口,每个接口只包含客户所需的方法。这使得实现类 只需实现其真正需要的接口&…

KindleUnpack - Python解压Amazon / Kindlegen生成的电子书

文章目录 关于 KindleUnpack使用选项 关于 KindleUnpack github : https://github.com/kevinhendricks/KindleUnpack KindleUnpack 是基于python的软件来解压Amazon / Kindlegen生成的电子书 KindleUnpack将非drm Kindle/MobiPocket电子书解压到其组件中 根据正在处理的Kindl…

Android Studio新增功能:Device Streaming

今天将Android Studio升级到2023.3.1 Patch2。发现新增了Device Streaming功能。支持远程使用Google的物理设备调试程序。这样可以方便地在真实设备上测试自己的APP。这对于手头没有Google设备的开发者而言,确实方便很多。该功能目前处于测试阶段,在2025…

交易中的群体行为特征和决策模型

本文基于人的行为和心理特征,归纳出交易中群体的行为决策模型,并基于这个模型,分析股价波浪运行背后的逻辑,以及投机情绪的周期变化规律,以此指导交易,分析潜在的风险和机会,寻找并等待高性价比…

system与excel族函数区别

1.system #include<stdlib.h> int system(const char *command); comand是命令的路径&#xff0c;一般我们用绝对路径 system函数会创建新的进程&#xff0c;新的进程执行完返回原来的进程&#xff0c;原来的进程则继续执行后面的代码段。 如我们创建一个sys.cpp文件…