Java结构型模式之桥接模式详解
一.介绍
桥接模式(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桥接模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
IDEA2020.2创建springboot项目卡死在reading maven project的问题
这篇文章主要介绍了关于2020.2IDEA用spring Initializr创建maven的springboot项目卡死在reading maven project的问题描述及解决方法,感兴趣的朋友跟随小编一起看看吧2020-09-09
解决Spring运行时报错:Consider defining a bean o
该文章主要讲述了在使用Spring框架时,如果遇到某个bean未找到的错误,应该在配置文件中定义该bean,解决方法是在对应的类上添加@Component注解2025-01-01
SpringBoot中Mybatis注解一对多和多对多查询实现示例
这篇文章主要介绍了SpringBoot中Mybatis注解一对多和多对多查询的实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-03-03
IntelliJ IDEA 2023版本创建Spring项目时Java只能选择17或21的问题解决方法
spring-boot是一个基于Java的开源框架,用于快速构建生产级别的应用程序,这篇文章主要给大家介绍了关于IntelliJ IDEA 2023版本创建Spring项目时Java只能选择17或21的问题解决方法,需要的朋友可以参考下2024-07-07
从java反编译及字节码角度探索分析String拼接字符串效率
这篇文章主要介绍了从java反编译及字节码角度探索分析String拼接字符串效率,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-12-12
详解SpringBoot2.0的@Cacheable(Redis)缓存失效时间解决方案
这篇文章主要介绍了详解SpringBoot2.0的@Cacheable(Redis)缓存失效时间解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2021-04-04


最新评论