【设计模式系列】桥接模式(十三)

一、什么是桥接模式

桥接模式(Bridge Pattern)是一种结构型设计模式,其核心目的是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式主要用于处理那些在设计时无法确定实现细节的场合,或者需要在多个实现之间进行切换的场景。

二、桥接模式的角色

  1. Abstraction(抽象类)

    • 角色定义:定义了客户端使用接口的骨架,并包含一个对Implementor对象的引用。
    • 功能:它是一个高层次的抽象,包含一些业务逻辑,同时能够通过其包含的Implementor引用调用相应的实现方法。Abstraction可以有一个或多个方法,这些方法会委托给Implementor对象执行。
  2. Implementor(实现类接口)

    • 角色定义:定义了实现类的接口,不实现具体操作,由具体实现类完成。
    • 功能:它是一个低层次的抽象,通常是一个接口或者抽象类,定义了实现类的公共方法规范。Implementor提供了一个或多个方法,这些方法可以在 ConcreteImplementor 中具体实现。
  3. ConcreteImplementor(具体实现类)

    • 角色定义:实现了Implementor接口的具体实现类。
    • 功能:它实现了Implementor接口的具体操作。ConcreteImplementor提供了具体的业务逻辑实现,这些实现可以被Abstraction通过多态的方式调用。
  4. RefinedAbstraction(扩展抽象类)(可选):

    • 角色定义:扩展Abstraction类,添加额外的功能。
    • 功能:RefinedAbstraction是Abstraction的子类,它可以添加一些额外的业务逻辑或者扩展Abstraction的功能。它可能包含一些新的方法,或者对Abstraction的方法进行扩展。

三、桥接模式的典型应用

  1. 持久化框架:持久化框架中,桥接模式可以将抽象的持久化接口与具体的数据库实现分离。这样,当需要支持新的数据库系统时,只需增加新的具体实现类,而无需修改持久化接口代码
  2. 消息发送器:消息发送器需要支持不同的消息协议(例如邮件、短信、即时通信等),使用桥接模式可以将消息发送器与具体的消息协议分离,使得可以方便地添加新的消息协议支持。

四、桥接模式在JDBC源码中的应用

抽象类(Abstraction)

// 抽象类:DatabaseConnection
public abstract class DatabaseConnection {protected Driver driver;public DatabaseConnection(Driver driver) {this.driver = driver;}public abstract void connect(String url);public abstract Statement createStatement();public abstract void disconnect();
}

实现类接口(Implementor)

// 实现类接口:Driver
public interface Driver {void connect(String url);void disconnect();Statement createStatement();
}

具体实现类(ConcreteImplementor)

// 具体实现类:MySQLDriver
public class MySQLDriver implements Driver {private Connection connection;@Overridepublic void connect(String url) {// 实现连接MySQL的逻辑System.out.println("Connecting to MySQL database at " + url);connection = DriverManager.getConnection(url);}@Overridepublic void disconnect() {// 实现断开连接的逻辑if (connection != null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}@Overridepublic Statement createStatement() {// 实现创建Statement的逻辑try {return connection.createStatement();} catch (SQLException e) {e.printStackTrace();return null;}}
}

扩展抽象类(RefinedAbstraction)

// 扩展抽象类:AdvancedDatabaseConnection
public class AdvancedDatabaseConnection extends DatabaseConnection {public AdvancedDatabaseConnection(Driver driver) {super(driver);}@Overridepublic void connect(String url) {driver.connect(url);System.out.println("Advanced setup before connecting to the database.");}@Overridepublic Statement createStatement() {return driver.createStatement();}@Overridepublic void disconnect() {System.out.println("Advanced cleanup before disconnecting from the database.");driver.disconnect();}
}

客户端代码

public class BridgePatternDemo {public static void main(String[] args) {// 客户端代码Driver driver = new MySQLDriver();DatabaseConnection dbConnection = new AdvancedDatabaseConnection(driver);dbConnection.connect("jdbc:mysql://localhost:3306/mydb");Statement statement = dbConnection.createStatement();// 使用statement执行数据库操作...dbConnection.disconnect();}
}

在这个示例中,DatabaseConnection是一个抽象类,它定义了操作数据库的接口,并组合了一个Driver类型的成员变量。Driver接口是实现类接口,定义了具体的数据库驱动必须实现的方法。MySQLDriver是一个具体实现类,实现了Driver接口,提供了连接MySQL数据库的具体逻辑。AdvancedDatabaseConnection是一个扩展抽象类,它扩展了DatabaseConnection类,并可能添加了一些额外的功能。客户端代码BridgePatternDemo创建了一个MySQLDriver的实例,并将其传递给AdvancedDatabaseConnection的构造函数,然后使用这个连接执行数据库操作。

这个示例展示了桥接模式如何将数据库连接的抽象部分(DatabaseConnection)与实现部分(Driver接口及其实现MySQLDriver)分离,使得系统可以灵活地切换不同的数据库驱动,同时保持抽象层的稳定。

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

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

相关文章

基于Multisim光控夜灯LED电路(含仿真和报告)

【全套资料.zip】光控夜灯LED电路设计Multisim仿真设计数字电子技术 文章目录 功能一、Multisim仿真源文件二、原理文档报告资料下载【Multisim仿真报告讲解视频.zip】 功能 光控夜灯LED电路 1.采用纯数字电路,非单片机。 2.通过检测周围光线,光线暗自…

html练习2

实现下列图片的效果 代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>* {margin: 0;padding: 0;}#menu {background-color: #0c0048;width: 100%;height: 50px;margin: auto;…

【毫米波雷达(八)】车载毫米波前雷达遮挡检测功能

车载毫米波前雷达遮挡检测功能 一、概念二、功能指标1、遮挡检测功能2、功能流程3、实车验证 一、概念 随着汽车行业智能化发展&#xff0c;车载毫米波雷达在汽车市场应用越来越广泛。在驾驶过程中&#xff0c;当雷达受到泥土、纸巾、冰雪覆盖遮挡后&#xff0c;雷达检测性能受…

小新学习k8s第六天之pod详解

一、资源限制 Pod是k8s中的最小的资源管理组件&#xff0c;pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。k8s中其他大多数组件都是围绕着Pod来进行支撑和扩展Pod功能的&#xff0c;例如&#xff0c;用于管理Pod运行的StatefulSet和Deployment等…

java面试2.0

一.Zookeeper 1.定义 ZooKeeper 是一个开源的分布式协调服务&#xff0c;它的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来&#xff0c;构成一个高效可靠的原语集&#xff0c;并以一系列简单易用的接口提供给用户使用。 ZooKeeper 为我们提供了高可用、高性能…

游戏测试|超越QA的常规:我们如何自动化回归测试

QA测试工作并不单调乏味&#xff0c;它是一项创造性的工作&#xff0c;蕴含着丰富的机会。公平地说&#xff0c;它也有枯燥乏味的一面--回归&#xff08;regression&#xff09;。因此&#xff0c;我们决定将回归测试自动化&#xff0c;具体方法如下。 ​ 在IT行业&#xff0c…

群分解(Swarm Decomposition,SWD)

代码原理 群体分解&#xff08;SWD&#xff09;是一种用于信号处理和数据分析的新兴方法。它通过将复杂的信号分解为多个群体成分&#xff08;Swarm Components&#xff09;&#xff0c;每个成分代表信号中的特定特征或模式。SWD的主要目标是提取信号中的不同特征模式&#xf…

flink实战-- flink任务的火焰图如何使用

火焰图 Flame Graphs 是一种有效的可视化工具,可以帮助我们排查如下问题: 目前哪些方法正在消耗 CPU 资源?一个方法的消耗与其他方法相比如何?哪一系列的堆栈调用导致了特定方法的执行?y 轴表示调用栈,每一层都是一个函数。调用栈越深,火焰就越高,顶部就是正在执行的…

CSS基础知识六(浮动的高度塌陷问题及解决方案)

目录 1.浮动高度塌陷概念 2.下面是几种解决高度塌陷的几种方案&#xff1a; 解决方案一&#xff1a; 解决方案二&#xff1a; 解决方案三&#xff1a; 1.浮动高度塌陷概念 在CSS中&#xff0c;高度塌陷问题指的是父元素没有正确地根据其内部的浮动元素或绝对定位元素来计…

拒绝事后背锅:测试项目中的风险管理一定要知道

在博主的公司中&#xff0c;测试经理除了要管理产品线的质量保障和日常部门事务工作外&#xff0c;另一项比较重要的就是测试项目全流程的管理。 今天不聊整体的测试项目流程如何开展&#xff0c;而是想聊一聊在同行中比较高频出现的一个字眼&#xff1a;风险管理。 什么是风…

基础算法——排序算法(冒泡排序,选择排序,堆排序,插入排序,希尔排序,归并排序,快速排序,计数排序,桶排序,基数排序,Java排序)

1.概述 比较排序算法 算法最好最坏平均空间稳定思想注意事项冒泡O(n)O( n 2 n^2 n2)O( n 2 n^2 n2)O(1)Y比较最好情况需要额外判断选择O( n 2 n^2 n2)O( n 2 n^2 n2)O( n 2 n^2 n2)O(1)N比较交换次数一般少于冒泡堆O( n l o g n nlogn nlogn)O( n l o g n nlogn nlogn)O( n l…

利用pythonstudio写的PDF、图片批量水印生成器,可同时为不同读者生成多组水印

现在很多场合需要将PDF或图片加水印&#xff0c;本程序利用pythonstudio编写。 第一步 界面 其中&#xff1a; LstMask:列表框 PopupMenu:PmnMark LstFiles:列表框 PopupMenu:PmnFiles OdFiles:文件选择器 Filter:PDF文件(.PDF)|.PDF|图像文件(.JPG)|.JPG|图像文件(.png…

如何区分实例化网格中的每个实例

1&#xff09;如何区分实例化网格中的每个实例 2&#xff09;项目在模拟器上切换程序后有概率画面冻结 3&#xff09;Unity工程导入团结引擎&#xff0c;GUID会变化&#xff0c;导致引用关系丢失 4&#xff09;Mask在Android平台下渲染异常 这是第407篇UWA技术知识分享的推送&a…

前端前置——ajax

目标&#xff1a;使用axios库&#xff0c;获取省份列表数据&#xff0c;展示到页面上 axios库地址&#xff1a;https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js 省份数据地址&#xff1a;http://hmajax.itheima.net/api/province axios的使用 axios({ url:目标资源地…

oasys系统代码审计

简述&#xff1a; oasys是一个OA办公自动化系统&#xff0c;使用Maven进行项目管理&#xff0c;基于springboot框架开发的项目&#xff0c;mysql底层数据库&#xff0c;前端采用freemarker模板引擎&#xff0c;Bootstrap作为前端UI框架&#xff0c;集成了jpa、mybatis等框架。…

书生大模型第三关Git 基础知识

关卡编号&#xff1a;L0G3000 任务一 破冰行动 fork仓库&#xff0c;注意这里不要勾选Copy branch Only!!!&#xff0c;因为后面课程中会使用到class分支&#xff1a; 克隆仓库&#xff1a; 移动分支&#xff1a; 创建自己的分支&#xff1a; 创建id.md文档&#xff0c;…

在vue3的vite网络请求报错 [vite] http proxy error:

在开发的过程中 代理proxy报错: [vite] http proxy error: /ranking/hostRank?dateType1 Error: connect ETIMEDOUT 43.xxx.xxx.xxx:443 网络请求是http的: // vite.config.ts import { Agent } from node:http;server: {host: 0.0.0.0,port: port,open: true,https: false,…

初识HTML

什么是HTML呢&#xff1f; HTML是超文本标记语言&#xff0c;HTML代码是由“标签”构成的 超文本&#xff1a;文本、声音、图片、视频、表格、链接 标记&#xff1a;由许许多多的标签组成 HTML页面是运行到浏览器上面的 第一个HTML程序 和C语言从hello world开始一样 HTML可…

DevOps-课堂笔记

各种 aaS 类比于计算机网络的 OSI 参考模型&#xff0c;一个软件应用项目需要不同的支撑层&#xff0c;例如从下至上大概需要&#xff1a; 硬件层面的服务器针对硬件做弹性分配的虚拟化机制&#xff0c;例如虚拟机在虚拟化环境内运行的 OS支撑软件应用的中间件&#xff0c;例…

AnatoMask的分层图像编码器-解码器

方法思想 采用多尺度编码器-解码器主干&#xff1a; 在编码器中&#xff0c;把CT图像分解成不同大小的图像块&#xff0c;从这些图像块中提取特征在解码器中&#xff0c;重建被掩盖图像时&#xff0c;考虑图像块的空间关系 输入D&#xff08;深度Depth&#xff09;张H&#x…