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

一、什么是桥接模式

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

java 复制代码
// 抽象类: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)

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

具体实现类(ConcreteImplementor)

java 复制代码
// 具体实现类: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)

java 复制代码
// 扩展抽象类: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();
    }
}

客户端代码

java 复制代码
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)分离,使得系统可以灵活地切换不同的数据库驱动,同时保持抽象层的稳定。

相关推荐
小蒜学长1 小时前
基于SSM+VUE的电影售票平台的设计与实现(代码+数据库+LW)
java·vue.js·spring boot·后端·ssm框架·电影售票平台
Wang's Blog1 小时前
Java框架 SpringCloud 快速入门: Feign 替代 RestTemplate 实现声明式远程调用
java·开发语言·spring cloud
谢亮_vipxieliang1 小时前
Go 结构体与方法集核心知识点
java·开发语言·golang
EatFan1 小时前
2026 Java 后端面试风向变了:八股文只是门槛,场景化追问才是淘汰线
java·开发语言·jvm·面试·后端面试·八股文·full gc
Q26433650231 小时前
【有源码】基于Spring Boot+Vue的骑行爱好者平台的设计与实现-计算机毕设选题推荐
java·vue.js·spring boot·毕业设计·课程设计·数据可视化·源代码
xieliyu.1 小时前
LeetCode 1419 数青蛙:状态模拟求最少青蛙数量|Java 题解
java·算法·leetcode
Wang's Blog1 小时前
Java框架 SpringCloud 快速入门: 微服务配置拉取
java·spring cloud·微服务
FYKJ_20101 小时前
SpringSecurity教室智能预约系统73972-计算机课程设计、毕业设计
java·vue.js·spring boot·python·mysql·spring·django
专业程序开发源1 小时前
springboot酒店会员点餐系统22339-计算机课程设计、毕业设计
java·javascript·vue.js·spring boot·后端·php·课程设计
Wang's Blog2 小时前
Java框架 SpringCloud 快速入门: 微服务框架课程介绍与知识地图
java·spring cloud·微服务