桥接模式详解和分析JDBC中的应用
🎯 设计模式专栏,持续更新中, 欢迎订阅:JAVA实现设计模式
🛠️ 希望小伙伴们一键三连,有问题私信都会回复,或者在评论区直接发言
桥接模式
文章目录
- 桥接模式
- 桥接模式的四个核心组成:
- 案例:电视与遥控器的桥接模式
- ⚙️代码实现
- Step 1: 实现 `TV` 接口 (Implementor)
- Step 2: 创建 `SonyTV` 和 `SamsungTV` 类 (Concrete Implementor)
- Step 3: 创建 `RemoteControl` 类 (Abstraction)
- Step 4: 创建 `SonyRemoteControl` 和 `SamsungRemoteControl` (Refined Abstraction)
- 🌟 Main函数展示桥接模式的使用
- 源码应用
- JDBC中的桥接模式源码探索:
- JDBC桥接模式总结:
- 📜 总结:
桥接模式(Bridge Pattern)是一种结构型设计模式,目的是将抽象部分与它的实现部分分离开来,使它们可以独立变化。这种模式通过组合的方式(而不是继承)将不同的维度分离,使代码更加灵活、易于扩展。
简单说法: 想象你有一个电视遥控器,遥控器负责打开/关闭电视、调节音量等操作。而不同品牌的电视(如索尼、三星)可能实现这些操作的方式不一样。桥接模式允许你在不修改遥控器代码的情况下,切换或扩展不同品牌的电视。遥控器和电视品牌之间使用接口桥接,使得它们可以独立变化。
桥接模式的四个核心组成:
- Abstraction(抽象部分):高层接口,定义抽象的操作,如遥控器的功能(打开、关闭、调音量等)。
- Refined Abstraction(扩展抽象部分):扩展自Abstraction,定义更具体的遥控器类型。
- Implementor(实现部分):具体实现接口,不同的实现类可以完成具体操作(不同品牌电视的功能实现)。
- Concrete Implementor(具体实现部分):Implementor的具体实现,如SonyTV和SamsungTV。
案例:电视与遥控器的桥接模式
你有一个通用的遥控器,可以操作不同品牌的电视,遥控器定义了on()
、off()
、setChannel()
等功能,而每个品牌的电视实现这些功能的细节可能不同。通过桥接模式,我们将遥控器和电视品牌分离,便于扩展。
UML类图结构
Abstraction ImplementorRemoteControl ----> TV/ \ / \
Concrete SonyRemote SonyTV SamsungTV
Abstraction ConcreteImplementor
⚙️代码实现
Step 1: 实现 TV
接口 (Implementor)
// TV接口定义基本操作
interface TV {void on();void off();void setChannel(int channel);
}
Step 2: 创建 SonyTV
和 SamsungTV
类 (Concrete Implementor)
// SonyTV 具体实现类
class SonyTV implements TV {@Overridepublic void on() {System.out.println("Sony TV is now ON");}@Overridepublic void off() {System.out.println("Sony TV is now OFF");}@Overridepublic void setChannel(int channel) {System.out.println("Sony TV: Channel set to " + channel);}
}// SamsungTV 具体实现类
class SamsungTV implements TV {@Overridepublic void on() {System.out.println("Samsung TV is now ON");}@Overridepublic void off() {System.out.println("Samsung TV is now OFF");}@Overridepublic void setChannel(int channel) {System.out.println("Samsung TV: Channel set to " + channel);}
}
Step 3: 创建 RemoteControl
类 (Abstraction)
// 遥控器抽象类,组合TV接口
abstract class RemoteControl {protected TV tv;// 通过构造方法传递TV对象,形成桥接public RemoteControl(TV tv) {this.tv = tv;}public abstract void on();public abstract void off();public abstract void setChannel(int channel);
}
Step 4: 创建 SonyRemoteControl
和 SamsungRemoteControl
(Refined Abstraction)
// 扩展的具体遥控器类,使用不同的TV实现
class SonyRemoteControl extends RemoteControl {public SonyRemoteControl(TV tv) {super(tv);}@Overridepublic void on() {System.out.println("Using Sony Remote Control:");tv.on();}@Overridepublic void off() {System.out.println("Using Sony Remote Control:");tv.off();}@Overridepublic void setChannel(int channel) {System.out.println("Using Sony Remote Control:");tv.setChannel(channel);}
}class SamsungRemoteControl extends RemoteControl {public SamsungRemoteControl(TV tv) {super(tv);}@Overridepublic void on() {System.out.println("Using Samsung Remote Control:");tv.on();}@Overridepublic void off() {System.out.println("Using Samsung Remote Control:");tv.off();}@Overridepublic void setChannel(int channel) {System.out.println("Using Samsung Remote Control:");tv.setChannel(channel);}
}
🌟 Main函数展示桥接模式的使用
public class BridgePatternDemo {public static void main(String[] args) {// 创建不同品牌的电视TV sonyTV = new SonyTV();TV samsungTV = new SamsungTV();// 使用Sony Remote控制Sony TVRemoteControl sonyRemote = new SonyRemoteControl(sonyTV);sonyRemote.on();sonyRemote.setChannel(5);sonyRemote.off();System.out.println("-------------");// 使用Samsung Remote控制Samsung TVRemoteControl samsungRemote = new SamsungRemoteControl(samsungTV);samsungRemote.on();samsungRemote.setChannel(10);samsungRemote.off();}
}
✨ 运行结果:
Using Sony Remote Control:
Sony TV is now ON
Using Sony Remote Control:
Sony TV: Channel set to 5
Using Sony Remote Control:
Sony TV is now OFF
-------------
Using Samsung Remote Control:
Samsung TV is now ON
Using Samsung Remote Control:
Samsung TV: Channel set to 10
Using Samsung Remote Control:
Samsung TV is now OFF
源码应用
JDBC中的桥接模式源码探索:
背景:
在Java的数据库连接(JDBC)中,JDBC API 提供了统一的数据库操作接口,而具体的数据库操作实现则由各数据库厂商的驱动(Driver)实现。这里,JDBC API 是抽象部分,而每个数据库驱动则是具体实现部分。
桥接模式分析:
- Abstraction(抽象部分):
java.sql.DriverManager
提供了一个统一的接口,用于注册不同数据库的驱动。 - Implementor(实现部分): 各个数据库驱动(例如MySQL、PostgreSQL、Oracle等),分别通过实现
java.sql.Driver
接口来具体执行数据库连接操作。
桥接效果:
程序员只需基于统一的JDBC
接口操作数据库,而无需关心底层数据库具体如何实现连接。通过桥接模式,可以轻松扩展或替换不同的数据库驱动,而不影响客户端代码。
代码使用示例:
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "user", "password");
DriverManager
在内部会根据传入的 JDBC URL
查找合适的 Driver
来建立数据库连接,这样就将抽象的 Connection
操作与具体的数据库实现分离。
🌐 桥接模式的类图
+-------------------------------------+ +--------------------------------+
| java.sql.Driver | <---- Bridge | Abstract representation |
|-------------------------------------| | of how to connect to database |
| + connect() | | using different implementations|
| + acceptURL() | +--------------------------------+
| + other common methods |
+----------------+--------------------+ ^| Implementor|+-------------------------------+ +------------------------------------+| com.mysql.cj.jdbc.Driver | | org.postgresql.Driver |+-------------------------------+ +------------------------------------+| + Implementation of connect() | | + Implementation of connect() |+-------------------------------+ +------------------------------------+^ ^| |+-------------------------------+ || java.sql.DriverManager | |+-------------------------------+ || + registerDriver(Driver d) | || + getConnection(String url) | || + other common methods | |+-------------------------------+ ||+------------+-------------+| java.sql.Connection |+--------------------------+| + createStatement() || + close() |+--------------------------+
⚙️ 关键源码解读:
1. Driver
接口(抽象部分,桥接接口)
package java.sql;import java.util.Properties;
import java.sql.SQLException;public interface Driver {// 尝试建立数据库连接Connection connect(String url, Properties info) throws SQLException;// 判断Driver是否可以处理传入的URLboolean acceptsURL(String url) throws SQLException;// 获取驱动的相关属性信息DriverPropertyInfo[] getPropertyInfo(String url, Properties info) throws SQLException;// 获取驱动的主版本号int getMajorVersion();// 获取驱动的次版本号int getMinorVersion();// 检查驱动是否为JDBC规范的合规实现boolean jdbcCompliant();
}
在这个接口中,Driver
定义了通用的行为,所有数据库驱动都需要实现这些方法,如 connect()
和 acceptsURL()
。
2. DriverManager
类(抽象部分与实现部分的桥梁)
package java.sql;import java.util.Enumeration;
import java.util.Vector;
import java.sql.Driver;
import java.sql.SQLException;public class DriverManager {// 注册驱动public static synchronized void registerDriver(java.sql.Driver driver) throws SQLException {registeredDrivers.addIfAbsent(new DriverInfo(driver));}// 通过指定URL连接数据库public static Connection getConnection(String url, String user, String password)throws SQLException {java.util.Properties info = new java.util.Properties();info.put("user", user);info.put("password", password);return getConnection(url, info);}// 具体的连接数据库逻辑public static Connection getConnection(String url, java.util.Properties info)throws SQLException {// 遍历已注册的驱动for (DriverInfo aDriver : registeredDrivers) {try {if (aDriver.driver.acceptsURL(url)) {return aDriver.driver.connect(url, info); // 调用驱动的connect方法}} catch (SQLException e) {// 忽略异常,尝试下一个驱动}}throw new SQLException("No suitable driver found for " + url);}// 保持已注册驱动的信息private static final CopyOnWriteArrayList<DriverInfo> registeredDrivers = new CopyOnWriteArrayList<>();static {// 内部静态代码块加载驱动loadInitialDrivers();}// 省略其他方法
}
解析:
DriverManager.registerDriver()
用于注册数据库驱动,开发者无需直接使用具体驱动类来注册。DriverManager.getConnection()
是我们日常使用的API,内部通过调用已注册的Driver
实现connect()
方法来建立连接。
桥接模式应用: DriverManager
作为抽象的管理者,通过 Driver
接口的实现来具体连接到不同的数据库,真正实现了抽象和实现的分离。不同的数据库驱动(如MySQL、PostgreSQL等)是 Driver
接口的不同实现,开发者使用统一的 DriverManager.getConnection()
方法进行数据库操作,无需了解底层的实现。
3. com.mysql.cj.jdbc.Driver
类(具体实现部分)
package com.mysql.cj.jdbc;import java.sql.Driver;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;public class Driver implements java.sql.Driver {static {try {// 在类加载时自动注册MySQL驱动java.sql.DriverManager.registerDriver(new Driver());} catch (SQLException e) {throw new RuntimeException("Failed to register MySQL driver.", e);}}@Overridepublic Connection connect(String url, Properties info) throws SQLException {// 检查是否支持该URLif (!acceptsURL(url)) {return null;}// 创建与MySQL数据库的连接return new ConnectionImpl(host, port, dbName, user, password);}@Overridepublic boolean acceptsURL(String url) {// 检查URL是否符合MySQL的格式return url.startsWith("jdbc:mysql:");}// 省略其他实现方法...
}
解析:
-
com.mysql.cj.jdbc.Driver
是Driver
接口的具体实现,通过桥接到DriverManager
,它实现了具体的连接MySQL数据库的逻辑。 -
acceptsURL()
方法判断传入的URL是否是MySQL的格式,connect()
方法则通过该URL与MySQL数据库建立连接。 -
JDBC桥接模式总结:
- Abstraction(抽象部分):
DriverManager
是抽象部分,提供统一的API供开发者使用,它只负责管理和协调不同的Driver
实现,而不关心具体实现细节。 - Implementor(实现部分): 各个数据库驱动实现了
Driver
接口,例如com.mysql.cj.jdbc.Driver
和org.postgresql.Driver
,它们分别负责与具体的数据库进行交互。
桥接模式通过分离抽象和实现,使得JDBC API可以轻松支持多种不同的数据库,而开发者只需通过统一的
DriverManager.getConnection()
进行操作。不同数据库的连接实现细节被隐藏在各自的Driver
实现类中,确保了系统的扩展性和维护性。 - Abstraction(抽象部分):
📜 总结:
桥接模式让我们能够将抽象部分与具体实现分离,在保持系统灵活的同时,允许独立扩展抽象和实现层次。在上面的例子中,RemoteControl
和 TV
分离,使得你可以轻松扩展更多不同类型的遥控器或电视品牌,而无需修改已有代码。
桥接模式在JDK和各种框架中得到广泛应用,特别是在处理跨平台差异、解耦抽象和实现的场景中。通过桥接模式,能够保持系统的高扩展性和灵活性,便于维护和改进。无论是数据库操作、GUI绘制、日志框架还是视图解析,桥接模式都扮演着核心角色。
相关文章:
桥接模式详解和分析JDBC中的应用
🎯 设计模式专栏,持续更新中, 欢迎订阅:JAVA实现设计模式 🛠️ 希望小伙伴们一键三连,有问题私信都会回复,或者在评论区直接发言 桥接模式 文章目录 桥接模式桥接模式的四个核心组成:…...

【python - 函数】
一、交互式会话 在与 Python 的交互式会话中,你可以在提示符 >>> 后键入一些 Python 代码,Python 解释器会读取并执行你键入的各种命令。 要启动交互式会话,请在终端 (Mac/Unix/Linux) 中键入 python3 或在 Windows 中打开 Python…...
scipy中稀疏矩阵特征值问题概述
在Python的scipy库中,这三种算法——ARPACK、LOBPCG、和AMG——都是用于求解稀疏矩阵特征值问题的数值方法。它们各自有不同的特性和适用场景,以下是详细说明: 1. ARPACK (Arnoldi Package) ARPACK(Arnoldi Package)…...

浅谈线性表——队列
文章目录 一、什么是队列?二、队列底层三、自我实现一个队列3.1、链式存储3.1.1、单向链表实现队列的实现代码3.1.2、双向链表实现队列的实现代码 3.2、顺序存储3.2.1、循环队列的实现代码 一、什么是队列? 队列是只允许在一端进行插入数据操作…...

2-94 基于matlab的最佳维纳滤波器的盲解卷积算法
基于matlab的最佳维纳滤波器的盲解卷积算法。维纳滤波将地震子波转换为任意所需要的形态。维纳滤波不同于反滤波,它是在最小平方的意义上为最 佳。基于最佳纳滤波理论的滤波器算法是莱文逊(Wiener—Levinson)算法。程序提供了4种子波和4种期望输出:零延迟…...

【提示词】浅谈GPT等大模型中的Prompt
Prompt是人工智能(AI)提示词,是一种利用自然语言来指导或激发人工智能模型完成特定任务的方法。在AI语境中,Prompt是一种自然语言输入,通常指的是向模型提出的一个请求或问题,这个请求或问题的形式和内容会…...

最强AI照片说话Windows一体包下载地址,口型合成音频驱动图片,免安装,下载即用
照片数字一键整合包:点击下载 一键安装包,简单一键启动,即刻使用,秒级体验。 目前效果最好的音频驱动图片说话的软件,比sadtalker、MuseTalk更清晰,效果更好,可以作为DID heygen的开源平替。原…...

Windows下使用cmake编译OpenCV
Windows下使用cmake编译OpenCV cmake下载OpenCV下载编译OpenCV cmake下载 下载地址:https://cmake.org/download/ 下载完成,点击选择路径安装即可 OpenCV下载 下载地址:https://github.com/opencv/opencv/releases/tag/4.8.1因为我们是编译…...
设计模式---中介者模式
设计模式---中介者模式 定义与设计思路中介者模式的引入:机场控制塔中介者模式的设计框架 定义与设计思路 定义:用一个中介对象来封装一系列对象交互。中介者使各对象不需要相互引用,从而使其耦合松散,而且可以独立地改变它们之间…...

六氟化硫密度微水在线监测配套5孔M12格兰头航空插头插座
我们将为大家介绍如何使用六氟化硫密度微水在线监测配套5孔M12格兰头连接器。在本教程中,我们将向您展示简单易懂的步骤,让您轻松掌握。 所需材料: 1. 六氟化硫密度微水在线监测器 2. 5孔M12格兰头连接器 3. 电源线 4. 符合要求的电缆 5…...

linux -L4.linux 暂停和启动进程
接第3课,L3 第3课-查看进程 通过端口号,查看对应的进程 netstat -tulnp | grep :9513暂停这个进程 Kill -STOP 5376重启这个进程 Kill -CONT 5376要查看特定PID对应的端口,你可以使用netstat命令结合grep工具来过滤输出。以下是一个基于L…...

Java多线程编程-基础篇
多线程相关的概念 并发 并发是指在同一时间段内,两个或多个任务在同一个处理器上交替执行,使得在宏观上看起来像是同时进行。并发是通过快速切换任务来模拟同时执行的效果,实际上在任何一个时刻点上只有一个任务在执行。 也就是说࿰…...

【极限、数学】 NOIP 2018 提高组初赛试题 第 7 题详解(线段长度期望)
在一条长度为 1 1 1 的线段上随机取两个点,则以这两个点为端点的线段的期望长度是( )。 考虑将一个线段上平均分布有 n ( n ≥ 2 ) n(n\geq 2) n(n≥2) 个节点,其中首尾均有一个节点,那么我们就将一个线段均分为 n…...

《论网络安全体系设计》写作框架,软考高级系统架构设计师
论文真题 随着社会信息化的普及,计算机网络已经在各行各业得到了广泛的应用。目前,绝大多数业务处理几乎完全依赖计算机和网络执行,各种重要数据如政府文件、工资档案、财务账目和人事档案等均依赖计算机和网络进行存储与传输。另一方面&…...

这款开源的通用PDF处理神器,功能炸裂!
今天分享一款以PDF为中心的多功能办公学习工具箱软件,包含四大板块功能:PDF实用工具箱、Anki制卡神器、Anki最强辅助、视频笔记神器,软件功能众多且强大,熟练运用可以大幅提高办公和学习效率,绝对是您不可多得的效率神…...

RabbitMQ延迟消息——DelayExchange插件
什么是死信以及死信交换机 当一个队列中的消息满足下列情况之一时,可以成为死信: 1. 消费者使用basic.reject或 basic.nack声明消费失败,并且消息的requeue参数设置为false 2. 消息是一个过期消息,超时无人消费 3. 要投递的队列消…...
【系统规划与管理师】【案例分析】【考点】【答案篇】第5章 IT服务部署实施
【问题篇】☞【系统规划与管理师】【案例分析】【考点】【问题篇】第5章 IT服务部署实施 【移动端浏览】☞【系统规划与管理师】【案例分析】【模拟考题】章节考题汇总(第5章)(答案篇)(共24个知识点) 第5章…...

华为云服务器的数据库部署及管理
不管是终端数据上报到服务器进行存储,还是客户端的动态请求都需要用到数据库,因此这里对数据库的使用进行了一些记录,租用的是华为云的ECS弹性服务器(Ubuntu18)。下面以网页登录的账号信息Acount为例。 一、Mysql的安装…...
C#【必备技能篇】替换一个字节(byte)中连续几位(bit)的内容
文章目录 一、一个示例二、通用方法 一、一个示例 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace ConsoleApp1 {class Program{static void Main(string[] args){Method1();}public static…...

roboguide将tp程序转化为LS文本格式的方法
不同的软件版本可能操作不同,但是仍然可以参考文章中的办法。 我使用的版本如图所示: 1.首先,打开任意一个工程,如果没有,可以打开自带的示例。 如图,我打开了自带的示例,在帮助文档中可以找到…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]
报错信息:libc.so.6: cannot open shared object file: No such file or directory: #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...

leetcode73-矩阵置零
leetcode 73 思路 记录 0 元素的位置:遍历整个矩阵,找出所有值为 0 的元素,并将它们的坐标记录在数组zeroPosition中置零操作:遍历记录的所有 0 元素位置,将每个位置对应的行和列的所有元素置为 0 具体步骤 初始化…...
从实验室到产业:IndexTTS 在六大核心场景的落地实践
一、内容创作:重构数字内容生产范式 在短视频创作领域,IndexTTS 的语音克隆技术彻底改变了配音流程。B 站 UP 主通过 5 秒参考音频即可克隆出郭老师音色,生成的 “各位吴彦祖们大家好” 语音相似度达 97%,单条视频播放量突破百万…...