桥接模式

桥接模式(Bridge Pattern):

桥接模式是一种结构型设计模式,它将抽象部分和实现部分分离,使它们可以独立变化。桥接模式通过组合而不是继承的方式,实现了抽象和实现的解耦,从而提高了系统的灵活性。

关键角色和概念:

  1. 抽象(Abstraction): 定义抽象部分的接口,并维护一个指向实现部分的引用。
  2. 扩展抽象(Refined Abstraction): 对抽象进行扩展,通常是在抽象的基础上添加一些额外的功能。
  3. 实现(Implementor): 定义实现部分的接口,供具体实现类使用。
  4. 具体实现(Concrete Implementor): 实现实现部分的接口,具体定义实现的细节。

桥接模式的优点:

  1. 解耦抽象和实现: 桥接模式通过将抽象和实现分离,使得它们可以独立变化,减少它们之间的耦合。
  2. 提高系统的可扩展性: 桥接模式使得抽象和实现可以独立地扩展,系统更容易进行功能的扩展和升级。
  3. 隐藏实现细节: 桥接模式通过将实现的细节隐藏在具体实现类中,对客户端透明,提高了系统的安全性。

桥接模式的应用举例:

如你所提到的 JDBC 中的 DriverManager 就是桥接模式的一个典型应用。在 JDBC 中,DriverManager 充当了抽象部分,而不同的数据库驱动充当了实现部分。这样,通过 DriverManager 和具体的数据库驱动的组合,实现了数据库连接的功能,并且可以方便地切换不同的数据库驱动,而不影响整体的结构。

java 复制代码
// 抽象部分
interface DriverManager {
    void getConnection();
}

// 具体实现部分
interface DatabaseDriver {
    void connect();
}

// 扩展抽象
class ConcreteDriverManager implements DriverManager {
    private DatabaseDriver driver;

    public ConcreteDriverManager(DatabaseDriver driver) {
        this.driver = driver;
    }

    @Override
    public void getConnection() {
        System.out.println("Connecting to database...");
        driver.connect();
    }
}

// 具体实现
class MySQLDriver implements DatabaseDriver {
    @Override
    public void connect() {
        System.out.println("Connected to MySQL database.");
    }
}

class OracleDriver implements DatabaseDriver {
    @Override
    public void connect() {
        System.out.println("Connected to Oracle database.");
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        DatabaseDriver mySQLDriver = new MySQLDriver();
        DatabaseDriver oracleDriver = new OracleDriver();

        DriverManager mySQLManager = new ConcreteDriverManager(mySQLDriver);
        DriverManager oracleManager = new ConcreteDriverManager(oracleDriver);

        mySQLManager.getConnection();
        oracleManager.getConnection();
    }
}

这里,DriverManager 是抽象部分,MySQLDriverOracleDriver 是具体实现部分。ConcreteDriverManager 扮演桥梁的角色,通过组合的方式将抽象和实现连接起来。

相关推荐
Shinomiya1 分钟前
Mysql之表的约束详解
后端
Java内核笔记5 分钟前
Spring Boot 4 与 Spring AI 2.0 深度集成:ChatClient、Advisor 链与 MCP(源码级实战)
java·后端
吃饱了得干活7 分钟前
一个订单的奇幻漂流:RabbitMQ 五大难题实战
spring boot·后端·rabbitmq
她的男孩10 分钟前
账号锁定配了"错 4 次锁 30 分钟",我连错 100 次一次没锁上:扒完 4091 行认证源码,找到 5 个坑
java·后端·架构
Methy14 分钟前
一次线上死锁排查:std::list::size () 居然是 O (n)?
c++·后端
MacroZheng24 分钟前
Redis官方发布高颜值可视化工具,功能更是强的离谱!
java·redis·后端
回家路上绕了弯41 分钟前
为什么 AI 写代码时,总喜欢“防御性编程”?
后端
灯澜忆梦44 分钟前
【Redis中间件】#4 | 进阶数据类型语法
redis·后端
广州山泉婚姻1 小时前
前后端分离的核心优势
前端·后端
IT_陈寒1 小时前
Vue的响应式让我加班到凌晨,问题竟出在这个不起眼的地方
前端·人工智能·后端