设计模式-桥接模式(Bridge)

文章目录

  • 前言
  • 一、桥接模式的概念
  • 二、桥接模式的实现
  • 三、桥接模式的优缺点
    • 1、优点:
    • 2、缺点:

前言

桥接模式(Bridge Pattern)是一种结构型设计模式,用于将抽象部分和实现部分分离,使它们可以独立地变化。这种分离允许你将一个类的功能层次结构(抽象)与另一个类的实现层次结构(实现)分开,从而在不同层次上进行修改和扩展。在本篇博客中,我们将详细介绍桥接模式的概念,然后提供一个Java代码示例来演示如何实现它。

一、桥接模式的概念

桥接模式的核心思想是将一个类的抽象部分与其实现部分分离开来,使它们可以独立地变化。在桥接模式中,抽象部分包括一个抽象类(或接口),它定义了抽象方法,而实现部分包括具体的实现类,它实现了抽象类中的方法。

桥接模式的结构包括以下要素:

  1. 抽象部分(Abstraction):定义抽象类(或接口),并包含一个对实现部分的引用。抽象部分定义了抽象方法,描述了客户端调用的接口。

  2. 扩展抽象部分(Refined Abstraction):扩展抽象部分,可以添加更多的方法或属性,对抽象部分进行更多的定制。

  3. 实现部分(Implementor):定义实现部分的接口,通常包括抽象方法。实现部分提供了具体实现,可以有多个不同的实现类。

  4. 具体实现部分(Concrete Implementor):实现实现部分的具体类,实现了实现部分的接口。

二、桥接模式的实现

让我们通过一个简单的示例来演示桥接模式的实现。我们将创建一个图形绘制应用程序,其中包括抽象图形和实际绘制引擎的桥接。

首先,我们定义抽象图形类 Shape 和绘制引擎接口 DrawingAPI

// 抽象图形类
abstract class Shape {protected DrawingAPI drawingAPI;protected Shape(DrawingAPI drawingAPI) {this.drawingAPI = drawingAPI;}public abstract void draw();
}// 绘制引擎接口
interface DrawingAPI {void drawCircle(int x, int y, int radius);
}

然后,我们创建具体的图形类 Circle 和实现引擎类 DrawingAPI1

// 具体图形类
class Circle extends Shape {private int x, y, radius;public Circle(int x, int y, int radius, DrawingAPI drawingAPI) {super(drawingAPI);this.x = x;this.y = y;this.radius = radius;}public void draw() {drawingAPI.drawCircle(x, y, radius);}
}// 实现引擎类 1
class DrawingAPI1 implements DrawingAPI {public void drawCircle(int x, int y, int radius) {System.out.printf("API1.circle at %d:%d radius %d%n", x, y, radius);}
}

接下来,我们创建另一个实现引擎类 DrawingAPI2

// 实现引擎类 2
class DrawingAPI2 implements DrawingAPI {public void drawCircle(int x, int y, int radius) {System.out.printf("API2.circle at %d:%d radius %d%n", x, y, radius);}
}

最后,我们编写客户端代码来测试桥接模式:

public class BridgePatternDemo {public static void main(String[] args) {DrawingAPI api1 = new DrawingAPI1();DrawingAPI api2 = new DrawingAPI2();Shape circle1 = new Circle(1, 2, 3, api1);Shape circle2 = new Circle(5, 7, 11, api2);circle1.draw();circle2.draw();}
}

在这个示例中,我们创建了两个不同的绘制引擎 DrawingAPI1DrawingAPI2,以及两个不同的圆形图形 `Circle

三、桥接模式的优缺点

桥接模式(Bridge Pattern)是一种有助于将抽象部分和实现部分分离的设计模式,它有一些明显的优点和一些潜在的缺点。让我们首先讨论一下桥接模式的优点:

1、优点:

  1. 分离抽象和实现:桥接模式通过将抽象部分和实现部分分离,使它们可以独立变化。这提高了系统的灵活性,允许你对它们进行独立的扩展和修改。

  2. 可扩展性:你可以轻松地扩展抽象部分和实现部分,而不必修改已有的代码。这使得你可以根据需要添加新的抽象或实现类,而无需改变现有代码。

  3. 可维护性:分离抽象和实现部分使代码更清晰,易于理解和维护。每个部分都有自己的接口,便于理解其功能和责任。

  4. 多维度变化:桥接模式允许多维度的变化,既可以扩展抽象部分,也可以扩展实现部分。这种组合可以产生多样化的对象组合,使得系统更加灵活。

  5. 隐藏细节:客户端不需要了解实现细节,只需与抽象接口交互。这有助于隐藏复杂性和细节,使客户端代码更简洁。

2、缺点:

  1. 增加复杂性:桥接模式引入了抽象部分和实现部分之间的间接性,可能会增加系统的复杂性。对于简单的情况,使用桥接模式可能会显得过于繁琐。

  2. 适用性限制:桥接模式主要用于处理抽象和实现之间的多维度变化。对于单一维度的变化,可能会显得过于繁重。

  3. 增加类的数量:桥接模式通常需要创建多个抽象类和实现类,这可能会导致类的数量增加。在小型项目中,这可能不是一个问题,但在大型项目中需要谨慎考虑。

  4. 设计的抽象程度:确定抽象和实现的划分和接口设计需要一定的经验和抽象能力。不恰当的设计可能导致模式失效或增加不必要的复杂性。

总的来说,桥接模式是一种有助于解决多维度变化的设计模式,它提供了灵活性和可维护性,但也需要权衡复杂性和适用性。在设计中,应根据具体的需求和情况来决定是否使用桥接模式。

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

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

相关文章

QT 5.13保姆级安装教程

辨清关系 要想学习一个新的东西,我们必须知其事,达其理,悟其道,然后才能无往而不利也! 我们常听到QT、Qt Creator 和 Qt SDK ,这三者究竟是什么,他们之间的关系又是如何的?在安装QT之前我们先来了解一下他们之间的关系: Qt:Qt 是一个跨平台的 C++ 应用程序开发框架,…

解决mysql表不能查询修改删除等操作并出现卡死

问题现象1:进程wait卡住 测试环境mysql出现了一个怪表:select查询表卡死,alter修改表卡死,甚至我不想要这个表了,delete、truncate、drop表都卡死卡主了… 解决办法: >show full processlist;    /…

一生一芯10——verilator v5.008环境搭建

搜索 verilator 官网,得到网址如下: https://www.veripool.org/verilator/ 点击download 找到 git quick install 可以看到git快捷安装所需命令行 可以看到,需要预先安装下面的包文件,去掉前面的#注释符号进行安装 直接进行下面…

天津大数据培训学校 大数据可从事的行业

大数据行业近年来呈现出爆炸式的增长态势,各行各业都越来越依赖数据来指导业务决策和创新发展,因此,大数据专业人才的需求也随之增长。这种行业需求的增长为大数据就业提供了良好的机会,尤其是对于具备相关技能和知识的人来说。 …

【C#】关于Array.Copy 和 GC

关于Array.Copy 和 GC //一个简单的 数组copy 什么情况下会触发GC呢[ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]public static void Copy(Array sourceArray,long sourceIndex,Array destinationArray,long destinationIndex,long length);当源和目…

173. 二叉搜索树迭代器

173. 二叉搜索树迭代器 题目-中等难度示例1. 列表解 题目-中等难度 实现一个二叉搜索树迭代器类BSTIterator ,表示一个按中序遍历二叉搜索树(BST)的迭代器: BSTIterator(TreeNode root) 初始化 BSTIterator 类的一个对象。BST 的…

js如何实现字符串反转?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用 split() 和 reverse() 方法⭐ 使用循环⭐ 使用递归⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专…

肖sir__设计测试用例方法之因果图07_(黑盒测试)

设计测试用例方法之因果图 一、定义:因果图提供了一个把规格转化为判定表的系统化方法,从该图中可以产生测试数据。其 中,原因是表示输入条件,结果是对输入执 行的一系列计算后得到的输出。 二、因果图方法最终生成的就是判定表。…

MySQL主从复制读写分离

读写分离 读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库 读写分离的好处 因为数据库的“写…

【Linux基础】权限管理

​👻内容专栏: Linux操作系统基础 🐨本文概括: 用户之间的切换、sudo提权、Linux权限管理、文件访问权限的相关方法、目录权限、粘滞位等 🐼本文作者: 阿四啊 🐸发布时间:2023.9.11 …

elasticsearch的DSL查询文档

DSL查询分类 查询所有:查询出所有数据,一般测试用。例如:match_all 全文检索(full text)查询:利用分词器对用户输入内容分词,然后去倒排索引库中匹配。例如: match_query multi_ma…

在Qt创建的UI中放一个显示点云的窗口(PCL+QT5)

1、首先在Qt Designer创建UI后,拖一个Widget窗口出来 2、在对象查看器中右击该Widget,选择提升窗口部件,如下操作: 3、把UI转出来放在VS项目中,其中你的UI代码头文件会自带QVTKOpenGLNativeWidget.h,当然你…

小谈设计模式(1)—总序

小谈设计模式(1)—总序 开始操作设计模式总论设计模式是什么组成要素模式名称问题描述解决方案效果描述 设计模式有什么作用提供可重用的解决方案提高代码的可读性和可维护性促进代码的可扩展性提高代码的灵活性和可重用性促进团队合作和沟通作用总结 为…

基于HBuilder X平台下的 驾校报名考试管理系统 uniapp 微信小程序3n9o5

本课题研究的是基于HBuilder X系统平台下的驾校管理系统,开发这款驾校管理系统主要是为了帮助学员可以不用约束时间与地点进行查看教练信息、考场信息等内容。本文详细讲述了驾校管理系统的界面设计及使用,主要包括界面的实现、控件的使用、界面的布局和…

【计算机网络】 TCP协议头相关知识点

文章目录 TCP协议头 TCP协议头 我们来看一下TCP协议头里都有什么东西,研究一下为什么TCP协议是可靠的呢 TCP协议可靠是因为在协议头里带着一些校验的数据 首先是源端口和目的端口,这两个是UDP中也有的,但是UDP中只有这两个,没有…

【多线程】线程池的简单实现与线程池的拒绝策略

目录 一、为什么使用线程池 二、标准库中的线程池 三、线程池的简单代码实现 四、标准库中线程池的构造方法解读 五、拒绝策略 一、为什么使用线程池 如果有多个线程,一个一个的去创建则需要从就绪状态被调度到运行状态不断切换然后死亡,这样的情况…

基于Linux的智能家居(工厂模式)

目录 1.项目概述 2.程序框架 3.函数准备 3.1需要函数知识点 3.2编码提醒 4.代码 5.注意事项 1.项目概述 控制端有两个,语音串口UART和Tcp通讯。 执行端有IO输出和IO输入。 2.程序框架 程序分为3部分-------------1.输入控制 2.输出设备 3.主函数-多线程…

h5上传图片并裁剪

本文主要实现,h5通过input上传图片后,利用cropperjs进行裁剪,获取指定尺寸 1 安装cropperjs npm install cropperjs 2 具体实现 home.jsx 代码中的result模块用来展示最终的裁剪结果;mask用作页面最上层蒙层,用来裁…

文件上传漏洞案例

目录 1.案例一 1)案例源码 2)创建web.php文件 3)使用抓包软件 2.案例二 1)案例代码 2) 案例分析 3)copy命令生成图片马 4)上传图片马到服务器 5)解析 文件图片 3.案例三 …

计算机系统的基本概念

计算机系统的基本概念 本文主要以hello.c这个程序的整个生命周期来简单了解一下计算机系统结构的基本概念。 #include <stdio.h>int main() {printf("hello, world\n");return 0; }gcc hello.c -o hello ./hello hello, world此刻&#xff0c;hello.c源程序…