当前位置: 首页 > news >正文

深入理解桥接模式(Bridge Pattern)及其实际应用

引言

在软件开发过程中,设计模式为我们提供了优雅且高效的解决方案,以应对常见的设计问题。桥接模式(Bridge Pattern)作为一种结构型设计模式,旨在将抽象部分与其实现部分分离,使它们可以独立变化,从而提高系统的灵活性和可扩展性。

本篇文章将详细介绍桥接模式的概念、应用场景、优缺点,并通过Java代码示例展示桥接模式的实际应用。

桥接模式简介

什么是桥接模式?

桥接模式是一种用于解耦抽象和实现的结构型设计模式。它通过提供一个桥接接口,将抽象部分与实现部分分离,使它们可以独立变化。这样,系统的可扩展性和灵活性得到了显著提升。

桥接模式的结构

桥接模式包含以下几个主要角色:

  • 抽象化(Abstraction):定义抽象类,并包含一个对实现化对象的引用。
  • 修正抽象化(Refined Abstraction):扩展抽象化类,通常增加新的功能。
  • 实现化(Implementor):定义实现化角色的接口,这个接口不一定要与抽象化接口完全一致,可以通过多个方法来提供具体实现。
  • 具体实现化(Concrete Implementor):具体实现化角色,实现Implementor接口。

UML类图

Bridge Pattern UML

桥接模式的代码示例

示例背景

假设我们有一个图形绘制程序,需要支持不同形状的图形(如圆形、正方形),并且需要为这些图形着色(如红色、绿色)。我们可以使用桥接模式来设计这个系统,使得图形和颜色可以独立变化。

实现化角色和具体实现化角色

首先,我们定义颜色接口和具体的颜色实现类:

// 实现化角色
interface Color {void applyColor();
}// 具体实现化角色
class RedColor implements Color {@Overridepublic void applyColor() {System.out.println("Applying red color");}
}class GreenColor implements Color {@Overridepublic void applyColor() {System.out.println("Applying green color");}
}

抽象化角色和修正抽象化角色

接下来,我们定义图形的抽象类和具体的图形实现类:

// 抽象化角色
abstract class Shape {protected Color color;public Shape(Color color) {this.color = color;}abstract void draw();
}// 修正抽象化角色
class Circle extends Shape {public Circle(Color color) {super(color);}@Overridevoid draw() {System.out.print("Drawing Circle with color: ");color.applyColor();}
}class Square extends Shape {public Square(Color color) {super(color);}@Overridevoid draw() {System.out.print("Drawing Square with color: ");color.applyColor();}
}

客户端代码

最后,我们在客户端代码中使用桥接模式:

public class BridgePatternDemo {public static void main(String[] args) {Shape redCircle = new Circle(new RedColor());Shape greenSquare = new Square(new GreenColor());redCircle.draw();greenSquare.draw();}
}

桥接模式在实际框架中的应用

桥接模式在许多实际框架中都有广泛的应用。下面我们以日志框架为例,展示桥接模式如何在实际应用中提高系统的灵活性和可扩展性。

案例分析:日志框架

假设我们有两个不同的日志系统:Log4j和SLF4J。我们希望通过桥接模式统一它们的接口,使得我们的应用可以动态选择使用哪种日志系统,而不需要修改业务代码。

实现化角色和具体实现化角色

首先,我们定义日志实现的接口和具体实现类:

// 实现化角色
public interface LoggerImplementor {void log(String message);
}// 具体实现化角色1:Log4j日志实现
public class Log4jLogger implements LoggerImplementor {@Overridepublic void log(String message) {System.out.println("Log4j Logger: " + message);}
}// 具体实现化角色2:SLF4J日志实现
public class Slf4jLogger implements LoggerImplementor {@Overridepublic void log(String message) {System.out.println("SLF4J Logger: " + message);}
}

抽象化角色和修正抽象化角色

然后,我们定义抽象化角色和具体的修正抽象化角色:

// 抽象化角色
public abstract class Logger {protected LoggerImplementor logger;public Logger(LoggerImplementor logger) {this.logger = logger;}public abstract void logMessage(String message);
}// 修正抽象化角色1:错误日志
public class ErrorLogger extends Logger {public ErrorLogger(LoggerImplementor logger) {super(logger);}@Overridepublic void logMessage(String message) {logger.log("[Error] " + message);}
}// 修正抽象化角色2:信息日志
public class InfoLogger extends Logger {public InfoLogger(LoggerImplementor logger) {super(logger);}@Overridepublic void logMessage(String message) {logger.log("[Info] " + message);}
}

客户端代码

最后,我们在客户端代码中使用桥接模式来使用日志框架:

public class BridgePatternLoggerDemo {public static void main(String[] args) {Logger errorLogger = new ErrorLogger(new Log4jLogger());Logger infoLogger = new InfoLogger(new Slf4jLogger());errorLogger.logMessage("This is an error message.");infoLogger.logMessage("This is an info message.");}
}

总结

桥接模式通过将抽象部分与其实现部分分离,使它们可以独立变化,提供了更加灵活和可扩展的系统设计方案。在日志框架中的应用展示了桥接模式的实际效果,提高了代码的可维护性和可扩展性。

希望这篇文章对你理解桥接模式有所帮助。如果觉得本文内容有价值,请点赞、收藏和关注我们,获取更多设计模式的精彩内容!


这样一篇博客文章不仅涵盖了桥接模式的详细解释和代码示例,还展示了它在实际框架中的应用,使得读者能够全面理解和掌握桥接模式的使用方法和优势。

相关文章:

深入理解桥接模式(Bridge Pattern)及其实际应用

引言 在软件开发过程中,设计模式为我们提供了优雅且高效的解决方案,以应对常见的设计问题。桥接模式(Bridge Pattern)作为一种结构型设计模式,旨在将抽象部分与其实现部分分离,使它们可以独立变化&#xf…...

Springboot + Mybatis 实现sql打印

参照这个视频:https://www.bilibili.com/video/BV1MS411N7mn/?vd_source90ebeef3261cec486646b6583e9f45f5 实现mybatis对外暴露的接口Interceptor 使用Intercepts接口,这里的写法参照mybatis-plus中的拦截器写法 Intercepts({Signature(type Executor.class, m…...

Cesium默认bing地图数据,还支持哪些地图的数据源呢?

传统的前端开发增长乏力了,新兴的web3D方向前端开发需求旺盛,这一块在国外很成熟,在国内兴起不久, 甚至很多前端老铁都没听过,没见过,没有意识到,前端除了框架、vue、uniapp这些烂大街的&#x…...

高效、智能、安全:小型机房EasyCVR+AI视频综合监控解决方案

一、背景需求分析 随着信息技术的迅猛发展,小型机房在企事业单位中扮演着越来越重要的角色。为了确保机房的安全稳定运行,远程监控成为了必不可少的手段。 二、视频监控 视频监控是机房远程监控的重要组成部分。通过安装IP摄像机及部署视频监控系统Ea…...

数据分析的Excel基础操作

数据透视表 1.先备份,创建原数据副本,将副本sheet隐藏掉。 2.看数据的量级,总行和总列。 3.浏览数据的字段和数值,大致看一下有无异常 4.找到插入->数据透视表,不选择默认点击确认创建,随意点击数据透视…...

【C语言】解决C语言报错:Invalid Pointer

文章目录 简介什么是Invalid PointerInvalid Pointer的常见原因如何检测和调试Invalid Pointer解决Invalid Pointer的最佳实践详细实例解析示例1:未初始化的指针示例2:已释放的指针示例3:返回局部变量的指针示例4:野指针 进一步阅…...

动态图形设计:创造视觉运动的艺术

什么是动态设计?动态设计是一个设计领域,指在用户界面中使用动态效果的设计。简单地说是为了移动用户界面上的元素而设计的。良好的动态设计可以吸引用户的注意,提高用户体验和满意度。动态设计也是界面设计与动态设计的结合,将设…...

CSS 属性 `mix-blend-mode`

CSS 属性 mix-blend-mode 在日常的 Web 开发中,我们大多时候都会使用一些常见的 CSS 属性,比如 font-size、color、background-color 等。但是,CSS 语言中还隐藏着许多鲜为人知但非常强大的属性,今天我们就来探讨其中一个 - mix-blend-mode。 mix-blend-mode 是什么? mix-b…...

三大交易所全面恢复 IPO 申请

6月21日晚间,北交所受理了3家企业的IPO申请,这是北交所时隔3个月之后恢复IPO受理。6月20日晚间,沪深交易所各受理了1家IPO申请,这是沪深交易所时隔半年后再次受理IPO。这也意味着,三大交易所IPO受理全部恢复。 6月21日…...

VC++开发积累——vc++6.0中删除函数的方法,右键,Delete

目录 引出插曲:删除函数的方法多行注释的实现代码输入的自动提示搜索出来,标记和取消标记跳转到上一步的位置 ctrl TAB 总结其他规范和帮助文档创建第一个Qt程序对象树概念信号signal槽slot自定义信号和槽1.自定义信号2.自定义槽3.建立连接4.进行触发 自…...

HBDNY-40/1端子排电压继电器 DC110V 导轨安装 约瑟JOSEF

HBDNY系列端子排型电压电流继电器 系列型号:(3、4过/低电压型,5、6过/低电流型) HBDNY-30/1端子排型电压继电器;HBDNY-30/2端子排型电压继电器; HBDNY-30/3端子排型电压继电器;HBDNY-30/4端子…...

Redis-数据类型-Geospatial(地理空间索引)

文章目录 1、查看redis是否启动2、通过客户端连接redis3、切换到db5数据库4、将地理位置信息(经度和纬度)添加到 Redis 的键(key)中4.1、添加大江商厦4.2、添加西部硅谷 5、升序返回有序集key,让分数一起和值返回的结果…...

Python联动Mysql

首先配置pip源(不然在安装库的时候会很慢!!!) pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/安装必要库: mysql.connector MySQL 连接器/ODBC 是 MySQL ODBC 驱动程序(以前称为 MyODBC 驱动程序)系列的名称,它使…...

vue3-openlayers 轨迹回放(历史轨迹)(ol-animation-path实现)

本篇介绍一下使用vue3-openlayers轨迹回放(历史轨迹)(ol-animation-path实现) 1 需求 轨迹回放(历史轨迹)实时轨迹 2 分析 轨迹回放(历史轨迹),一般是一次性拿到所有…...

计算机视觉全系列实战教程 (十二):图像分割(阈值分割threshold、分水岭算法watershed的使用步骤、洪水填充floodFill算法的使用)

1.图像分割概述 (1)What(什么是图像分割) 将图像划分为不同的子区域,使得同一子区域具有较高的相似性,不同的子区域具有明显的差异性 (2)Why(对图像进行分割有什么作用) 医学领域:将不同组织分割成不同区域帮助分析病情军事领域&#xff…...

Linux的免交互

交互:我们发出指令控制程序的运行,程序在接收到指令之后按照指令的效果做出对应的反应。 免交互:间接的通过第三方的方式把指令传送给程序,不用直接的下达指令。 1、here document免交互 ere document免交互:是命令…...

查看es p12证书文件过期方法

查看证书过期时间: openssl pkcs12 -in elastic-certificates.p12 -nokeys -out elastic-certificates.crt (需要输入证书生成时配置密码) openssl x509 -enddate -noout -in elastic-certificates.crt...

1.8 无符号大数加、减运算

作者 李卫明 单位 杭州电子科技大学 1.8 无符号大数加、减运算。程序设计中经常遇到无符号大数加、减运算问题,请在样例程序Ex1.4基础上实现无符号大数减运算。题目要求输入两个无符号大数,保证一个大数不小于第二个大数,输出它们的和、差。…...

Java常用类--包装类

包装类 一方面出于性能方面的考虑,java为数值使用基本类型,而不是对象。基本类型不是对象层次的组成部分,它们不继承Object。 另一方面有时需要创建表示基本类型的对象,例如集合类只处理对象。为了在类中存储基本类型,…...

SpringMvcの拦截器全局异常处理

一、拦截器 我们在网上发贴子的时候如果没有登录,点击发送按钮会提示未进行登录,跳转到登录页面。这样的功能是如何实现的。 1、 拦截器的作用 Spring MVC 的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...

微信小程序之bind和catch

这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解

一、前言 在HarmonyOS 5的应用开发模型中&#xff0c;featureAbility是旧版FA模型&#xff08;Feature Ability&#xff09;的用法&#xff0c;Stage模型已采用全新的应用架构&#xff0c;推荐使用组件化的上下文获取方式&#xff0c;而非依赖featureAbility。 FA大概是API7之…...