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

news2024/11/7 23:21:02

一、什么是桥接模式

桥接模式(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;

    @Override
    public void connect(String url) {
        // 实现连接MySQL的逻辑
        System.out.println("Connecting to MySQL database at " + url);
        connection = DriverManager.getConnection(url);
    }

    @Override
    public void disconnect() {
        // 实现断开连接的逻辑
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public 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);
    }

    @Override
    public void connect(String url) {
        driver.connect(url);
        System.out.println("Advanced setup before connecting to the database.");
    }

    @Override
    public Statement createStatement() {
        return driver.createStatement();
    }

    @Override
    public 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.coloradmin.cn/o/2235363.html

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

相关文章

泷羽sec学习打卡-shodan扫描4

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 关于shodan的那些事儿-4 一、shodan4如何查看公网ip?如何查看自己的ip?如何查看出…

杨传辉:云+AI 时代的一体化数据库|OceanBase发布会实录

在 2024 OceanBase 年度发布会 上, OceanBase CTO 杨传辉进行了主题为《云和 AI 时代的一体化数据库战略思考》的演讲,本文为演讲实录,欢迎阅读。 视频观看可点击:https://www.oceanbase.com/video/9001825 各位 OceanBase 的客…

04 深入 Oracle 并发世界:MVCC、锁、闩锁、事务隔离与并发性能优化的探索

文章目录 深入 Oracle 并发世界:MVCC、锁、闩锁、事务隔离与并发性能优化的探索一、多版本并发控制(MVCC)1.1 理论解析1.2 实践应用 二、锁与闩锁机制2.1 理论解析2.2 实践应用 三、事务隔离级别3.1 理论解析3.2 实践应用 四、死锁预防与解决…

Python-利用tkinter库编写一个exe伪恶意程序文件(下)

前言 接着上篇所讲的,我们已经完成了源代码的准备,并将其储存在了function_1.py文件中。接下来我们将把function_1.py文件编写为相对应的exe文件。那么好,废话不多说,我们直接开始。(温馨提示:由于整蛊的需…

vue使用canves把数字转成图片验证码

<canvas id"captchaCanvas" width"100" height"40"></canvas>function drawCaptcha(text) {const canvas document.getElementById(captchaCanvas);const ctx canvas.getContext(2d);// 设置背景颜色ctx.fillStyle #f0f0f0;ctx.f…

商标注册流程

个人名义&#xff08;自然人&#xff09;申请准备&#xff1a;身份证复印件(签字&#xff0c;PDF格式&#xff0c;小于2M)&#xff1b;个体户执照副本复印件(签字&#xff0c;PDF格式&#xff0c;小于2M)&#xff1b;商标图样(建议黑白JPG&#xff0c;建议尺寸800*800尺寸)。公…

《ElementPlus 与 ElementUI 差异集合》Icon 图标 More 差异说明

参考 《element plus 使用 icon 图标(两种方式)》使用 icon 升级 Vue2 升级 Vue3 项目时&#xff0c;遇到命名时的实心与空心点差异&#xff01; ElementUI&#xff1a; 实心是 el-icon-more空心是 el-icon-more-outline ElementPlus&#xff1a; 实心是 el-icon-more-fill…

如何利用 Python 的爬虫技术获取淘宝天猫商品的价格信息?

以下是使用 Python 的爬虫技术获取淘宝天猫商品价格信息的两种常见方法&#xff1a; 方法一&#xff1a;使用 Selenium 一、环境准备&#xff1a; 安装 selenium 库&#xff1a;在命令行中运行 pip install selenium。下载浏览器驱动&#xff1a;如 ChromeDriver&#xff08;确…

Navicat for MySQL 错误:1251

mySql&#xff1a;8.4 Navicat for MySQL&#xff1a;11.0.10 企业版 绿色版 官网中关于mysql_native_password插件的说法&#xff1a;链接 1. 问题 连接数据库报错&#xff1a;1251 要求升级Navicat for MySQL 2. 原因 mysql中的mysql_native_password插件默认是关闭的 …

Android 如何写代码更少出现bug?借助IDE的检测代码质量插件来解决。

目录 前言 大家好呀~&#xff0c;我是前期后期&#xff0c;在网上冲浪的一名程序员&#xff0c;分享一些自己学到的知识&#xff0c;希望能够帮助大家节省时间。 如何写代码更少出现bug&#xff1f; 很多一些人可能会推荐我们&#xff0c;多看一些阿里巴巴的规范&#xff0c…

洛谷 P2113 看球泡妹子(DP)

传送门https://www.luogu.com.cn/problem/P2113 解题思路 可以设 表示前 场比赛看了 场&#xff0c;小红的满足度为 的最大精彩度。 然后可以枚举前面的一个比赛 &#xff0c;可以得到转移方程&#xff1a; 但是&#xff0c;我们发现数组空间有一点小大&#xff0c;可以…

HTAP数据库国产化改造技术可行性方案分析

一、现状及需求痛点 当前地市统一支撑平台是为地市租户提供全方位业务支持的核心系统&#xff0c;以满足地市级用户在业务处理、数据分析、用户服务及内部管理等多方面的需求。主要承载业务系统的联机事务处理&#xff08;OLTP&#xff09;与联机分析处理&#xff08;OLAP&…

ELK-ELK基本概念_ElasticSearch的配置

文章目录 一、什么是ELK&#xff1f;有什么用&#xff1f;ELK是什么&#xff1f;ElasticsearchLogstashKibana ELK的作用 二、ElasticSearch的安装与基本配置为何需要依赖JDK&#xff1f;使用yum install java-11-openjdk和使用Oracle官网提供的jdk的rpm包安装JDK的区别 参考资…

OpenAI大事记;GPT到ChatGPT参数量进化

目录 OpenAI大事记 GPT到ChatGPT参数量进化 OpenAI大事记 GPT到ChatGPT参数量进化 ChatGPT是从初代 GPT逐渐演变而来的。在进化的过程中,GPT系列模型的参数数量呈指数级增长,从初代GPT的1.17亿个参数,到GPT-2的15 亿个参数,再到 GPT-3的1750 亿个参数。模型越来越大,训练…

DDD领域分析

DDD领域分析是一种对现实业务进行建模分析的一种方法&#xff0c;它对业务问题做了分类&#xff0c;分层与抽象&#xff0c;为后面代码的编写理清了思路。 如何理解DDD呢&#xff1f;首先DDD中有许多名称&#xff0c;我这里一一列举出来&#xff1a;领域&#xff0c;子域&…

ES集群搭建(仅供自己参考)

单节点问题&#xff1a;单机的elasticsearch做数据存储&#xff0c;面临的两个问题&#xff1a;海量的数据存储问题、单节点故障。 一个节点存储的数据是有限的。 海量数据存储问题&#xff1a;将索引库从逻辑上拆分为N个分片&#xff08;shard&#xff09;&#xff0c;存储到…

【测试工具篇一】全网最强保姆级教程抓包工具Fiddler(2)

本文接上篇Fiddler介绍&#xff0c;开始讲fiddler如何使用之前&#xff0c;给大家讲讲http以及web方面的小知识&#xff0c;方便大家后面更好得理解fiddler使用。 目录 一、软件体系结构---B/S与C/S架构 B/S架构 C/S架构 二、HTTP基础知识 什么是http请求和响应? http协…

诗林工作室(编号:mb0003)分享:Finbiz自适应响应式网页设计模版,适用于前端设计、博客、官网等多类型开发模版

本设计模版来自外网&#xff0c;为HTML类型的模版&#xff0c;色彩多样&#xff0c;适合Web开发人员做前端站点设计参考使用。全站模版倾向于官网设计、自主博客等多行业的平台模版开发&#xff0c;适合各大CMS的主题模版开发参考&#xff0c;如常见的Wordpress主题开发、Z-Blo…

2-142【软件无线电原理与应用作业】基于matlab的圆形阵列的波束形成进行仿真

【软件无线电原理与应用作业】基于matlab的圆形阵列的波束形成进行仿真&#xff0c;具有14页文档。假设发射信号载频为1GHz&#xff0c;圆形阵列半径为0.8米&#xff0c;在圆周上均匀布置30个阵元。1.画出指向0度的方向图。2.如果目标在0度&#xff0c;有一不相干的干扰信号在3…

[CUDA] 设置sync模式cudaSetDeviceFlags

文章目录 1. 设置cuda synchronize的等待模式2 设置函数3. streamQuery方式实现stream sync等待逻辑Reference 1. 设置cuda synchronize的等待模式 参考资料&#xff1a;https://docs.nvidia.com/cuda/pdf/CUDA_Runtime_API.pdf cuda的 synchronize等待模式分为&#xff1a; Y…