深入理解桥接模式(Bridge Pattern)及其实际应用
引言
在软件开发过程中,设计模式为我们提供了优雅且高效的解决方案,以应对常见的设计问题。桥接模式(Bridge Pattern)作为一种结构型设计模式,旨在将抽象部分与其实现部分分离,使它们可以独立变化,从而提高系统的灵活性和可扩展性。
本篇文章将详细介绍桥接模式的概念、应用场景、优缺点,并通过Java代码示例展示桥接模式的实际应用。
桥接模式简介
什么是桥接模式?
桥接模式是一种用于解耦抽象和实现的结构型设计模式。它通过提供一个桥接接口,将抽象部分与实现部分分离,使它们可以独立变化。这样,系统的可扩展性和灵活性得到了显著提升。
桥接模式的结构
桥接模式包含以下几个主要角色:
- 抽象化(Abstraction):定义抽象类,并包含一个对实现化对象的引用。
- 修正抽象化(Refined Abstraction):扩展抽象化类,通常增加新的功能。
- 实现化(Implementor):定义实现化角色的接口,这个接口不一定要与抽象化接口完全一致,可以通过多个方法来提供具体实现。
- 具体实现化(Concrete Implementor):具体实现化角色,实现Implementor接口。
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)作为一种结构型设计模式,旨在将抽象部分与其实现部分分离,使它们可以独立变化…...

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(对图像进行分割有什么作用) 医学领域:将不同组织分割成不同区域帮助分析病情军事领域ÿ…...

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,用于对处理器进行预处理和后处理…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...

python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...