Java结构型模式之桥接模式详解

 更新时间:2023年02月17日 10:25:00   作者:非凡的小笨鱼  
桥接模式是一种很实用的结构型模式,如果系统中某个类存在两个独立变化的维度,通过桥接模式将这两个维度分离出来,使两者可以独立扩展

一.介绍

桥接模式(Bridge Pattern)属于结构型模式。用于将抽象与其实现解耦,使得二者可以独立变化。桥接模式使用组合/聚合替代继承,从而连接功能层面与实现层面,把强关联转为弱关联之后进行双向扩展

适配器模式可以在抽象层不变的情况下,对实现进行扩展和变化;而桥接模式可以在抽象和实现两个维度独立扩展和变化

二.场景理解

JPA是ORM框架的抽象,或者说是Java提供的持久化标准,而Hibernate与TopLink则是ORM框架的具体实现,而在Hibernate框架下,又有针对一系列数据库厂商的具体实现,图中是以继承的方式表现Hibernate、TopLink框架下不同数据库厂商的行为变化

上图我们将ORM框架数记为N,将数据库厂商数记为M,如果要新增一个ORM框架,就会生成M个子类,如果新增了一个数据库厂商,就要新增N个子类,两个维度不能够独立的进行扩展,而且最终子类的个数是N*M,代码复杂度会指数型增长,可能会造成类爆炸

JDBC是Java提供的访问关系型数据库的一套标准,根据合成复用原则(组合/聚合优先于继承),在JPA中组合了不同数据库厂商的抽象,此时就在功能层面和实现层面建立起了一座桥梁,无论是ORM框架个数还是数据库厂商的个数都可以进行独立的扩展了,而最终子类的个数仅是N+M

三.UML类图

四.具体代码

业务代码

//抽象化角色
public abstract class JPA {
    protected JDBC jdbc;
    protected JPA(JDBC jdbc) {
        this.jdbc = jdbc;
    }
    public abstract void insert();
}
//扩展抽象化角色
class Hibernate extends JPA{
    protected Hibernate(JDBC jdbc) {
        super(jdbc);
    }
    @Override
    public void insert() {
       System.out.println("Hibernate环境");
       jdbc.insert();
    }
}
//扩展抽象化角色
class TopLink extends JPA{
    protected TopLink(JDBC jdbc) {
        super(jdbc);
    }
    @Override
    public void insert() {
        System.out.println("TopLink环境");
        jdbc.insert();
    }
}
interface JDBC{
   void insert();
}
//具体实现化角色
class MySQL implements JDBC{
    @Override
    public void insert() {
        System.out.println("MySQL执行新增操作");
    }
}
//具体实现化角色
class Oracle implements JDBC{
    @Override
    public void insert() {
        System.out.println("Oracle执行新增操作");
    }
}

客户端

public class Client {
    public static void main(String[] args) {
        //数据库厂商
        JDBC jdbc = new MySQL();
        //ORM框架
        JPA jpa = new Hibernate(jdbc);
        jpa.insert();
    }
}

五.优缺点

优点

  • 符合开闭原则
  • 符合合成复用原则
  • 抽象与实现分离,扩展能力极强

缺点

  • 组合/聚合关系建立在抽象层,增加系统的理解与设计难度

六.使用场景

  • 当一个系统存在两个独立变化的维度,且这两个维度都需要进行扩展
  • 当一个系统不希望使用继承或因为多层次继承导致类的个数急剧增加

到此这篇关于Java结构型模式之桥接模式详解的文章就介绍到这了,更多相关Java桥接模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 谈谈java的concurrent用法

    谈谈java的concurrent用法

    这篇文章给大家介绍java的concurrent用法,感兴趣的朋友一起学习吧
    2015-10-10
  • Java进阶之高并发核心Selector详解

    Java进阶之高并发核心Selector详解

    前几篇文章介绍了Java高并发的一些基础内容,认识了Channel,Buffer和Selector的基本用法,有了感性认识之后,来看看Selector的底层是如何实现的。,需要的朋友可以参考下
    2021-05-05
  • SpringBoot整合sharding-jdbc实现分库分表与读写分离的示例

    SpringBoot整合sharding-jdbc实现分库分表与读写分离的示例

    本文主要介绍了SpringBoot整合sharding-jdbc实现分库分表与读写分离的示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Java设计模式之责任链模式

    Java设计模式之责任链模式

    今天小编就为大家分享一篇关于Java设计模式之责任链模式,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • 深入理解@component与@Configuration注解

    深入理解@component与@Configuration注解

    这篇文章主要介绍了深入理解@component与@Configuration注解,从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被扫描,并用于构建bean定义,初始化Spring容器,需要的朋友可以参考下
    2023-11-11
  • 阿里Sentinel支持Spring Cloud Gateway的实现

    阿里Sentinel支持Spring Cloud Gateway的实现

    这篇文章主要介绍了阿里Sentinel支持Spring Cloud Gateway的实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-04-04
  • macOS下Spring Boot开发环境搭建教程

    macOS下Spring Boot开发环境搭建教程

    这篇文章主要为大家详细介绍了macOS下Spring Boot开发环境搭建教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • 一篇文章带你解决 IDEA 每次新建项目 maven home directory 总是改变的问题

    一篇文章带你解决 IDEA 每次新建项目 maven home directory 总是改变的问题

    这篇文章主要介绍了一篇文章带你解决 IDEA 每次新建项目 maven home directory 总是改变的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • 基于Java Tomcat和激活MyEclips的深入理解

    基于Java Tomcat和激活MyEclips的深入理解

    本篇文章是对Java中的Tomcat和激活MyEclips进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • SpringBoot自动装配Condition的实现方式

    SpringBoot自动装配Condition的实现方式

    这篇文章主要介绍了SpringBoot自动装配Condition的实现方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08

最新评论