重读Java设计模式: 桥接模式详解

2024-04-06 08:36

本文主要是介绍重读Java设计模式: 桥接模式详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

引言

在软件开发中,经常会遇到需要在抽象与实现之间建立连接的情况。当系统需要支持多个维度的变化时,使用传统的继承方式往往会导致类爆炸和耦合度增加的问题。为了解决这一问题,我们可以使用桥接模式。桥接模式是一种结构型设计模式,它将抽象部分与其实现部分分离,使它们可以独立地变化。本文将深入探讨桥接模式的概念、应用场景以及在实际项目中的实现方式。

一、理解桥接模式

1.1 什么是桥接模式?

桥接模式是一种结构型设计模式,旨在将抽象部分与其实现部分分离,使它们可以独立地变化。桥接模式通过将抽象和实现解耦,使得它们可以独立地扩展,而不会相互影响。这种分离使得系统更加灵活,可以应对不断变化的需求。

1.2 桥接模式的角色

在桥接模式中,通常有以下几个角色:

  • 抽象化(Abstraction):定义抽象类的接口,并维护一个指向实现化对象的引用。
  • 扩展抽象化(Refined Abstraction):对抽象化角色进行扩展,实现更加精细的抽象接口。
  • 实现化(Implementor):定义实现类的接口,供抽象化角色调用。
  • 具体实现化(Concrete Implementor):具体的实现类,实现了实现化角色定义的接口。

二、桥接模式的应用场景

2.1 多维度变化的情况

当一个类存在多个变化维度,并且这些变化维度需要独立扩展时,可以考虑使用桥接模式。例如,一个形状类有不同的颜色和绘制方式,可以使用桥接模式将形状与颜色、绘制方式分离,实现各自独立的扩展。

2.2 需要避免使用继承的情况

在传统的继承方式中,类的继承关系是静态的,一旦继承关系确定,就不容易变化。而使用桥接模式可以在运行时动态地选择抽象和实现的组合,避免了继承方式的静态性。

三、Java 中的桥接模式实现

在 Java 中,桥接模式的实现通常通过接口和实现类组合的方式来实现。我们就以上面说的一个形状有不同的颜色和绘制方式,可以使用桥接模式将形状与颜色方式分离,实现各自独立的扩展举例

先来看下示例的 UML 图:

  • 抽象化与扩展抽象化部分
public abstract class Shape {protected final DrawApi drawApi;public Shape(DrawApi api) {this.drawApi = api;}public abstract void draw();
}public class Circle extends Shape {public Circle(DrawApi api) {super(api);}@Overridepublic void draw() {System.out.println("Draw Circle : " + drawApi.draw());}
}public class Square extends Shape {public Square(DrawApi api) {super(api);}@Overridepublic void draw() {System.out.println("Draw Square: " + drawApi.draw());}
}
  • 实现化部分与具体实现化部分
public interface DrawApi {String draw();
}public class RedDraw implements DrawApi{@Overridepublic String draw() {return "使用红色颜料画图";}
}public class BlueDraw implements DrawApi{@Overridepublic String draw() {return "使用蓝色颜料画图";}
}
  • 客户端部分
package com.markus.desgin.mode.structural.bridge;/*** @Author: zhangchenglong06* @Date: 2024/3/12* @Description:*/
public class BridgePatternDemo {/*** Spring 中 JdbcTemplate 和 DataSource 之间的关系就是一种 桥接模式* @param args*/public static void main(String[] args) {RedDraw redDraw = new RedDraw();BlueDraw blueDraw = new BlueDraw();Shape red = new Circle(redDraw);Shape blue = new Circle(blueDraw);red.draw();blue.draw();red = new Square(redDraw);blue = new Square(blueDraw);red.draw();blue.draw();}
}

四、桥接模式在 Spring 框架中的应用

在 Spring 框架中,使用桥接模式的一个典型例子是在 JdbcTemplateDataSource 之间。这两个组件是 Spring 框架中处理数据库操作的核心组件之一。

JdbcTemplate

JdbcTemplate 是 Spring 框架提供的一个用于简化 JDBC 编程的类,它封装了大量的 JDBC 操作,使得开发者可以通过简单的方法调用来执行数据库查询、更新等操作,而无需手动管理数据库连接、预处理语句、结果集等资源。通过使用 JdbcTemplate,开发者可以专注于业务逻辑的实现,而不用过多关注底层的数据库操作细节。

DataSource

DataSource 是 Java 中用于管理数据库连接的接口,它定义了一系列获取数据库连接的方法,如 getConnection()getConnection(username, password) 等。在实际应用中,DataSource 通常是由数据库厂商提供的具体实现,比如 Apache 的 Commons DBCP、C3P0 等。

桥接模式应用

Spring 框架中使用桥接模式的地方就是在 JdbcTemplateDataSource 之间的连接。具体来说,JdbcTemplate 充当了抽象化角色,而 DataSource 则充当了实现化角色。通过在 JdbcTemplate 中注入 DataSource 实例,Spring 可以利用桥接模式将两者连接起来,实现数据库操作的统一接口。这样一来,JdbcTemplate 就可以使用 DataSource 提供的数据库连接,从而执行相应的 SQL 操作。

下面是一个简单的示例代码,演示了 JdbcTemplateDataSource 之间的桥接模式应用:

@Configuration
public class AppConfig {@Beanpublic DataSource dataSource() {// 配置数据源,这里使用 HikariCP 数据源作为示例HikariConfig config = new HikariConfig();config.setJdbcUrl("jdbc:mysql://localhost:3306/mydatabase");config.setUsername("username");config.setPassword("password");return new HikariDataSource(config);}@Beanpublic JdbcTemplate jdbcTemplate(DataSource dataSource) {// 注入数据源到 JdbcTemplate 中return new JdbcTemplate(dataSource);}
}

在上面的示例中,我们通过 @Bean 注解配置了一个 DataSource 实例,并将其注入到 JdbcTemplate 中。这样一来,在其他组件中就可以直接注入 JdbcTemplate,然后使用它来执行数据库操作,而不用关心底层的数据库连接细节。

总之,Spring 框架中使用桥接模式将 JdbcTemplateDataSource 结合起来,使得开发者可以更加便捷地进行数据库操作,提高了开发效率和代码的可维护性。

五、设计模式百宝箱

  • 在本节,我们继续填充我们的百宝箱:

    • 面向对象基础
      • 抽象
      • 封装
      • 多态
      • 继承
    • 面向对象原则
      • 依赖抽象,不要依赖具体类
      • 针对接口编程,不针对具体实现编程
      • 类应该对扩展开放,对修改关闭
      • 为交互对象之间的松耦合设计而努力
      • 多用组合,少用继承
    • 面向对象设计模式
      • 简单工厂模式:定义了一个创建对象的接口,将创建对象的内容从客户端抽离出来
      • 抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类
      • 原型模式:通过复制现有对象来创建新对象,提高代码效率和可维护性
      • 建造者模式:将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示
      • 适配器模式:将一个类的接口转换成客户期望的另一个接口。适配器让原来接口不兼容的类可以合作无间
      • 桥接模式:将抽象与实现分离,不止改变你的实现,也能改变你的抽象

六、总结

总结一下,本篇文章详细介绍了桥接模式在 Java 设计中的应用,以及在 Spring 框架中的实际应用。首先,它解释了桥接模式的基本概念和角色,以及适用场景。然后,通过一个形状与颜色绘制方式分离的示例展示了桥接模式的实现。最后,以 JdbcTemplate 和 DataSource 之间的关系为例,说明了桥接模式在 Spring 中的应用,通过桥接模式将两者连接起来,实现了数据库操作的统一接口。

这篇关于重读Java设计模式: 桥接模式详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/879485

相关文章

一文深入详解Python的secrets模块

《一文深入详解Python的secrets模块》在构建涉及用户身份认证、权限管理、加密通信等系统时,开发者最不能忽视的一个问题就是“安全性”,Python在3.6版本中引入了专门面向安全用途的secr... 目录引言一、背景与动机:为什么需要 secrets 模块?二、secrets 模块的核心功能1. 基

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2

SpringBoot整合Flowable实现工作流的详细流程

《SpringBoot整合Flowable实现工作流的详细流程》Flowable是一个使用Java编写的轻量级业务流程引擎,Flowable流程引擎可用于部署BPMN2.0流程定义,创建这些流程定义的... 目录1、流程引擎介绍2、创建项目3、画流程图4、开发接口4.1 Java 类梳理4.2 查看流程图4

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

HTML5 搜索框Search Box详解

《HTML5搜索框SearchBox详解》HTML5的搜索框是一个强大的工具,能够有效提升用户体验,通过结合自动补全功能和适当的样式,可以创建出既美观又实用的搜索界面,这篇文章给大家介绍HTML5... html5 搜索框(Search Box)详解搜索框是一个用于输入查询内容的控件,通常用于网站或应用程

Java对异常的认识与异常的处理小结

《Java对异常的认识与异常的处理小结》Java程序在运行时可能出现的错误或非正常情况称为异常,下面给大家介绍Java对异常的认识与异常的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参... 目录一、认识异常与异常类型。二、异常的处理三、总结 一、认识异常与异常类型。(1)简单定义-什么是

Redis Cluster模式配置

《RedisCluster模式配置》:本文主要介绍RedisCluster模式配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录分片 一、分片的本质与核心价值二、分片实现方案对比 ‌三、分片算法详解1. ‌范围分片(顺序分片)‌2. ‌哈希分片3. ‌虚

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.