11、桥接模式(Bridge Pattern)

桥接模式(Bridge Pattern)通过将抽象及其实现解耦,使二者可以根据需求独立变化。这种类型的设计模式属于结构型模式,通过定义一个抽象和实现之间的桥接者来达到解耦的目的。

桥接模型主要用于解决在需求多变的情况下使用继承造成类爆炸的问题,扩展起来不够灵活。可以通过桥接模式将抽象部分与实现部分分离,使其能够独立变化而相互之间的功能不受影响。具体做法是通过定义一个桥接接口,使得实体类的功能独立于接口实现类,降低它们之间的耦合度。

常用的JDBC和DriverManager就使用了桥接模式,JDBC在连接数据库时,在各个数据库之间进行切换而不需要修改代码,因为JDBC提供了统一的接口Driver,每个数据库都提供了各自的实现,通过一个叫作数据库驱动的程序来桥接即可。以数据库连接为例,UML设计图如下:

1)定义Driver接口:

public interface Driver {
    void executeSQL();
}

2)定义Driver接口的MySQL实现类MysqlDriver:

@Slf4j
public class MySQLDriver implements Driver {
    @Override
    public void executeSQL() {
      log.info("execute sql by mysql driver...");
    }
}

3)定义Driver接口的Oracle实现类OracleDriver:

@Slf4j
public class OracleDriver implements Driver {
    @Override
    public void executeSQL() {
      log.info("execute sql by oracle driver...");
    }
}

4)定义抽象类DriverManagerBridge,用于实现桥接模式,该类定义了Driver的注入,用户注入不同的驱动器便能实现不同类型的数据库的切换:

public abstract class DriverManagerBridge {
    private Driver driver;

    public Driver getDriver() {
        return driver;
    }

    public void setDriver(Driver driver) {
        this.driver = driver;
    }

    public void execute() {
        this.driver.executeSQL();
    }
}

5)定义MyDriverBridge:

public class MyDriverBridge extends DriverManagerBridge {
    @Override
    public void execute() {
        getDriver().executeSQL();
    }
}

6)测试桥接模式:

package cn.jaa.bridge_pattern;

/**
 * @Author: Jaa
 * @Description:
 * @Date 2023/11/30
 */
public class BridgeDemoTest {

    public static void main(String[] args) {
        DriverManagerBridge driverBridge = new MyDriverBridge();
        // set MySQL driver
        driverBridge.setDriver(new MySQLDriver());
        driverBridge.execute();
        // switch Oracle driver
        driverBridge.setDriver(new OracleDriver());
        driverBridge.execute();
    }
}

运行结果:

相关推荐

  1. 设计模式-11 - Bridge Method 模式

    2023-12-05 15:16:35       32 阅读
  2. 设计模式

    2023-12-05 15:16:35       42 阅读
  3. [go] 模式

    2023-12-05 15:16:35       65 阅读
  4. 模式简介

    2023-12-05 15:16:35       43 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-05 15:16:35       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-05 15:16:35       101 阅读
  3. 在Django里面运行非项目文件

    2023-12-05 15:16:35       82 阅读
  4. Python语言-面向对象

    2023-12-05 15:16:35       91 阅读

热门阅读

  1. 桥接模式 (Bridge Pattern)

    2023-12-05 15:16:35       54 阅读
  2. AR技术详解

    2023-12-05 15:16:35       57 阅读
  3. UVM中的config_db机制传递interface

    2023-12-05 15:16:35       61 阅读
  4. 上机十 文件的读取

    2023-12-05 15:16:35       56 阅读