0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

桥接模式应用场景

科技绿洲 来源:Java技术指北 作者:Java技术指北 2023-10-09 14:30 次阅读

1、什么是桥接模式?

Decouple an abstraction from its implementation so that the two can vary independently.

桥接模式(Bridge Pattern):将抽象和实现解耦, 使得两者可以独立地变化。

另外一种解释是:一个类存在两个(或多个)独立变化的维度,我们通过组合的方式,让这两个(或多个)维度可以独立进行扩展。

听起来可能还是很深奥,没关系,下面通过例子讲解。

2、桥接模式定义

图片

①、Abstraction

抽象化角色:它的主要职责是定义出该角色的行为, 同时保存一个对实现化角色的引用, 该角色一般是抽象类。

②、Implementor

实现化角色:它是接口或者抽象类, 定义角色必需的行为和属性。

③、RefinedAbstraction

修正抽象化角色:它引用实现化角色对抽象化角色进行修正。

④、ConcreteImplementor

具体实现化角色:它实现接口或抽象类定义的方法和属性。

3、桥接模式通用代码实现

实现化类:

public interface Implementor {

    void doSomething();
}

具体实现化类:

public class ConcreteImplementor1 implements Implementor{
    @Override
    public void doSomething() {
        // 具体业务逻辑处理
    }
}
public class ConcreteImplementor2 implements Implementor{
    @Override
    public void doSomething() {
        // 具体业务逻辑
    }
}

这里定义了两个,可能有多个。

抽象化角色:

public abstract class Abstraction {
    // 定义对实现化角色的引用
    private Implementor implementor;

    public Abstraction(Implementor implementor){
        this.implementor = implementor;
    }

    // 自身的行为和属性
    public void request(){
        this.implementor.doSomething();
    }

    // 获取实现化角色
    public Implementor getImplementor(){
        return implementor;
    }
}

修正抽象化角色:

public class RefinedAbstraction extends  Abstraction{
    // 覆写构造函数
    public RefinedAbstraction(Implementor implementor){
        super(implementor);
    }

    // 修正父类的行为
    @Override
    public void request() {
        super.request();
    }
}

测试:

public class BridgeClient {
    public static void main(String[] args) {
        // 定义一个实现化角色
        Implementor implementor = new ConcreteImplementor1();
        // 定义一个抽象化角色
        Abstraction abstraction = new RefinedAbstraction(implementor);
        // 执行方法
        abstraction.request();

    }
}

如果我们的实现化角色有很多的子接口, 然后是一堆的子实现。在构造函数中传递一个明确的实现者, 代码也是很清晰的。

4、桥接模式经典例子—JDBC

我们在刚开始用 JDBC 直连数据库的时候,会有这样一段代码:

Class.forName("com.mysql.cj.jdbc.Driver");//加载及注册JDBC驱动程序
String url = "jdbc:mysql://localhost:3306/sample_db?user=root&password=your_password";
Connection con = DriverManager.getConnection(url);
Statement stmt = con.createStatement();
String query = "select * from test";
ResultSet rs=stmt.executeQuery(query);
while(rs.next()) {
  rs.getString(1);
  rs.getInt(2);
}

如果我们想要把 MySQL 数据库换成 Oracle 数据库,只需要把第一行代码中的 com.mysql.cj.jdbc.Driver 换成oracle.jdbc.driver.OracleDriver 就可以了。

这种优雅的实现数据库切换方式就是利用了桥接模式。

我们首先看 Driver 类:

package com.mysql.cj.jdbc;

import java.sql.DriverManager;
import java.sql.SQLException;

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    public Driver() throws SQLException {
    }

    static {
        try {
            DriverManager.registerDriver(new Driver());
        } catch (SQLException var1) {
            throw new RuntimeException("Can't register driver!");
        }
    }
}

这段代码 Class.forName("com.mysql.cj.jdbc.Driver") 作用有两个:

①、要求 JVM 查找并加载指定的 Driver 类。

②、执行该类的静态代码,也就是将 MySQL Driver 注册到 DriverManager 类中。

接着我们看 DriverManager 类:

public class DriverManager {
  private final static CopyOnWriteArrayList< DriverInfo > registeredDrivers = new CopyOnWriteArrayList< DriverInfo >();

  //...
  static {
    loadInitialDrivers();
    println("JDBC DriverManager initialized");
  }
  //...

  public static synchronized void registerDriver(java.sql.Driver driver) throws SQLException {
    if (driver != null) {
      registeredDrivers.addIfAbsent(new DriverInfo(driver));
    } else {
      throw new NullPointerException();
    }
  }

  public static Connection getConnection(String url, String user, String password) throws SQLException {
    java.util.Properties info = new java.util.Properties();
    if (user != null) {
      info.put("user", user);
    }
    if (password != null) {
      info.put("password", password);
    }
    return (getConnection(url, info, Reflection.getCallerClass()));
  }
  //...
}

当我们把具体的 Driver 实现类(比如,com.mysql.cj.jdbc.Driver)注册到 DriverManager 之后,后续所有对 JDBC 接口的调用,都会委派到对具体的 Driver 实现类来执行。而 Driver 实现类都实现了相同的接口(java.sql.Driver ),这也是可以灵活切换 Driver 的原因。

图片

5、桥接模式优点

①、抽象和实现分离

这也是桥梁模式的主要特点, 它完全是为了解决继承的缺点而提出的设计模式。在该模式下, 实现可以不受抽象的约束, 不用再绑定在一个固定的抽象层次上。

②、优秀的扩充能力

看看我们的例子, 想增加实现?没问题!想增加抽象, 也没有问题!只要对外暴露的接口层允许这样的变化, 我们已经把变化的可能性减到最小。

③、实现细节对客户透明

客户不用关心细节的实现, 它已经由抽象层通过聚合关系完成了封装。

6、桥接模式应用场景

①、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。

②、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。

③、一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    7639

    浏览量

    148495
  • 数据库
    +关注

    关注

    7

    文章

    3591

    浏览量

    63371
  • 函数
    +关注

    关注

    3

    文章

    3868

    浏览量

    61309
  • 代码
    +关注

    关注

    30

    文章

    4555

    浏览量

    66772
  • JDBC
    +关注

    关注

    0

    文章

    25

    浏览量

    13298
收藏 人收藏

    评论

    相关推荐

    恩智浦推出全套雷达传感器解决方案,可对汽车进行360度安全环绕式探测

    恩智浦解决方案能够满足NCAP角雷达的要求,同时经济高效尺寸小,支持汽车大批量生产应用,还为长距离前向雷达和高级多模式用场景(例如盲点检测、变道辅助和俯仰角检测)提供了可扩展性。
    发表于 01-22 11:16 876次阅读

    AG32VF-MIPI应用场景

    to 1.2Gbps MIPI D-PHY以及DSI硬核 AG32VF-MIPI的应用场景,包括了基本的MIPI屏幕驱动,以及各种显示场合,如下图所示。 AG32VF-MIPI系列产品即将正式发布。
    发表于 01-22 08:56

    我国成立航运区块链平台MarineX,助力全球海事产业的可持续发展

    当前,航运业对区块链技术的应用正在如火如荼地进行中,航运企业、金融机构、物流公司、贸易商以及不断涌现的初创技术公司都在拥抱和尝试“航运+区块链”的模式和应用场景
    发表于 09-11 14:22 1494次阅读

    2019年经典Android高级面试题资料总结

    说下你所知道的设计模式与使用场景a.建造者模式: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 使用场景比如最常见的AlertDialog,拿我们开发
    发表于 06-06 17:50 0次下载
    2019年经典Android高级面试题资料总结

    运营商筹资5G建设资金的路径可以分为四种方式

    虽然5G的商业模式和应用场景并不明确,但是5G将给社会和经济发展带来巨大效益的“大饼”值得所有人期待。另外,获得5G牌照的四家企业,即便其中最弱的中国联通,这些都是国内巨无霸。而且即便不考虑这些巨无霸背后的国家支持,四家企业自身的实力也足够信用背书。
    发表于 06-13 09:55 2084次阅读

    NB-IOT智能锁解决方案的详细报告资料免费下载

    本文档的主要内容详细介绍的是NB-IOT智能锁解决方案的详细报告资料免费下载包括了:背景介绍,解决方法,业务模型,商务模式,应用场景
    发表于 07-17 08:00 8次下载
    NB-IOT智能锁解决方案的详细报告资料免费下载

    测量光幕扫描分析模式及应用场景示例

    邦纳测量光幕之所以能够成为一个多面手,得益于邦纳的设计人员赋予了它如下八种的扫描分析模式,使其能够从容应对不同的应用场景
    的头像 发表于 07-28 16:21 2965次阅读

    Arm Pelion物联网设备管理服务助力智能电表制造商实现大规模家庭部署

    借助物联网,这些设备的部署不仅为海兴带来了创收机遇,还为公用事业供应商及终端用户建立了全新商业模式和应用场景平台。
    发表于 08-19 11:16 752次阅读
    Arm Pelion物联网设备管理服务助力智能电表制造商实现大规模家庭部署

    示波器的FastFrame分段存储模式的应用场景分析

    如今工程师们在面对复杂系统的调试和验证时面临着许多测试技术挑战,包括捕获和可视化多个不频繁或间断出现的事件,如串行数据包、激光脉冲和故障信号。为了准确地测量和表征这些信号,必须在长时间内以高采样率捕获它们。
    发表于 09-22 09:10 1044次阅读
    示波器的FastFrame分段存储<b class='flag-5'>模式</b>的应<b class='flag-5'>用场景</b>分析

    本地云服务将成为未来云服务的重要选择

    近日,IDC正式发布《分布式云之 -- 本地云服务市场研究》报告,从概念与特征、产品与模式、应用场景及发展趋势等多个方面,对分布式云组合中的本地云服务模式进行分析及解读。其中,浪潮云作为典型服务商之一被纳入报告分析中。
    的头像 发表于 01-12 15:02 2432次阅读

    原型模式的应用场景_如何快速设计一款温湿度产品原型(MCU接入)

    我主要从开发角度讲讲怎么快速设计一款智能温控器产品原型吧。温湿度传感器作为基础传感类别,在智能家居领域应用广泛。通过温湿度传感器采集温度和湿度,可以实现多样化的智能场景联动。比如在炎热的夏季,温湿度
    发表于 10-28 20:36 10次下载
    原型<b class='flag-5'>模式</b>的应<b class='flag-5'>用场景</b>_如何快速设计一款温湿度产品原型(MCU接入)

    记录一下使用I2C VIP验证芯片的一个bug

    具体到SMBus模式的使用场景,我需要在发送完一笔数据后,修改数据中的command值。
    的头像 发表于 09-21 09:26 2570次阅读
    记录一下使用I2C VIP验证芯片的一个bug

    设计模式中代理模式的使用场景

    设计模式在我看来更像是一种设计思维或设计思想,它就像《孙子兵法》一样,为你的项目工程提供方向,让你的项目工程更加健壮、灵活,延续生命力。本文即将分享的是设计模式的其中一种:代理模式。 代理模式
    的头像 发表于 10-08 14:34 401次阅读
    设计<b class='flag-5'>模式</b>中代理<b class='flag-5'>模式</b>的使<b class='flag-5'>用场景</b>

    HDMI无缝拼接矩阵的三种模式

    等问题。HDMI无缝拼接矩阵拥有多种模式,例如常规拼接模式、画中画模式和画外画模式。本文将详细介绍和解析这三种模式的原理和应
    的头像 发表于 12-04 14:40 393次阅读

    php设计模式和应用场景

    ,从小型的网站到大型的企业级应用程序。 下面将介绍一些常见的PHP设计模式及其应用场景。 单例模式(Singleton Pattern): 单例模式用于限制类的实例化,确保一个类只有一
    的头像 发表于 12-04 14:54 310次阅读