跟着GPT学设计模式之桥接模式

来自APOD

说明

桥接模式,也叫作桥梁模式,英文是 Bridge Design Pattern。在 GoF 的《设计模式》一书中,桥接模式是这么定义的:“Decouple an abstraction from its implementation so that the two can vary independently。”翻译成中文就是:“将抽象和实现解耦,让它们可以独立变化。” 桥接模式通过将一个类的抽象部分与实现部分分离开来,使它们可以独立地进行扩展和修改。

在桥接模式中,有两个核心概念:

  • 抽象部分(Abstraction):定义抽象部分的接口,并维护一个对实现部分对象的引用。抽象部分将客户端的请求委派给实现部分进行处理。
  • 实现部分(Implementation):定义实现部分的接口,并提供具体实现。实现部分通常是通过接口或抽象类来定义,让不同的实现部分可以灵活替换。

通过桥接模式,抽象部分和实现部分可以独立地发展和演化,不会相互影响。这种解耦可以提高系统的灵活性和可扩展性。桥接模式常用于以下情况:

  • 当一个类拥有多个变化维度时,可以使用桥接模式将每个维度抽象出来,使得它们可以独立地变化。
  • 当需要在抽象部分和实现部分之间建立稳定的关联关系,又希望它们可以独立地进行扩展和修改时,可以使用桥接模式。

以下是桥接模式的结构示意图:

Abstraction
+ implementor: Implementor
+operation()
RefinedAbstraction
+operation()
Implementor
+operationImpl()
ConcreteImplementorA
+operationImpl()
ConcreteImplementorB
+operationImpl()

Abstraction(抽象化角色)通过持有Implementor(实现化角色)的引用,将操作委托给Implementor来实现。RefinedAbstraction(扩充抽象化角色)继承自Abstraction,并可以在基础操作上添加额外的功能。Implementor(实现化角色)是一个接口或抽象类,定义了在Abstraction中使用的操作方法。ConcreteImplementorA和ConcreteImplementorB(具体实现化角色)实现了Implementor接口,并提供了具体的操作实现。

在桥接模式中,抽象部分通过聚合(或组合)实现部分的对象来实现功能。通过定义抽象部分和实现部分的接口,以及维护它们之间的关联关系,可以实现抽象部分与实现部分的解耦和独立变化。

应用场景

在Java开源项目中,桥接模式有许多应用场景。以下是其中几个示例:

  • JDBC(Java Database Connectivity):JDBC是Java中用于与数据库进行交互的API。它使用桥接模式将Java应用程序与不同数据库之间的连接进行解耦。JDBC提供了一个标准的接口,即抽象部分,而具体的数据库驱动程序实现则作为实现部分。这使得开发人员可以通过改变数据库驱动程序实现来与不同类型的数据库进行交互,而不需要修改应用程序的代码。
  • AWT(Abstract Window Toolkit)和Swing:AWT和Swing是Java的图形用户界面(GUI)工具包。它们使用桥接模式将组件的外观(如按钮、文本框)与底层操作系统的窗口系统分离开来。在AWT和Swing中,抽象部分是Java中的组件类,而实现部分是由底层平台提供的本地窗口系统。
  • 日志库:许多Java开源项目使用日志库进行日志记录。例如,Log4j和Logback是常见的日志库。它们使用桥接模式将应用程序的日志记录行为与底层的日志输出目标(如控制台、文件、数据库)解耦。抽象部分是由日志库提供的通用日志API,而实现部分是具体的日志输出目标。
  • 数据源连接池:连接池被广泛用于管理数据库连接的重用。在Java中,常见的开源连接池项目如HikariCP和Commons DBCP使用桥接模式来支持不同类型的数据库连接。它们提供了一个通用的连接池接口作为抽象部分,而具体的数据库驱动程序实现则作为实现部分。

这些示例说明了在Java开源项目中桥接模式的应用。通过桥接模式,可以将不同维度的变化解耦,在代码的可扩展性和灵活性方面提供支持。

编程示例

首先,定义抽象部分的接口或抽象类。这个接口或抽象类将定义高层操作或功能,并将包含一个对实现部分的引用。例如:

public interface Shape {void draw();
}

接下来,创建实现部分的接口或抽象类。这个接口或抽象类将定义实现部分的操作或功能。例如:

public interface Color {void fill();
}

然后,实现具体的实现部分类。这些类将实现实现部分的接口或抽象类。例如:

public class Red implements Color {@Overridepublic void fill() {System.out.println("Filling with red color");}
}
public class Blue implements Color {@Overridepublic void fill() {System.out.println("Filling with blue color");}
}

在抽象部分的接口或抽象类中添加对实现部分的引用,并在其中定义具体的操作。例如:

public abstract class AbstractShape implements Shape {protected Color color;public AbstractShape(Color color) {this.color = color;}public abstract void draw();
}

最后,创建具体的抽象部分类。这些类将扩展抽象部分的接口或抽象类,并实现具体的操作。例如:

public class Circle extends AbstractShape {public Circle(Color color) {super(color);}@Overridepublic void draw() {System.out.print("Drawing a circle. ");color.fill();}
}
public class Rectangle extends AbstractShape {public Rectangle(Color color) {super(color);}@Overridepublic void draw() {System.out.print("Drawing a rectangle. ");color.fill();}
}

现在,可以使用桥接模式来创建抽象部分和实现部分之间的桥接:

// 创建实现部分的对象
Color red = new Red();
Color blue = new Blue();// 创建抽象部分的对象并进行桥接
Shape redCircle = new Circle(red);
Shape blueRectangle = new Rectangle(blue);// 调用抽象部分的方法,它会委派给实现部分的对象
redCircle.draw(); // Output: Drawing a circle. Filling with red color
blueRectangle.draw(); // Output: Drawing a rectangle. Filling with blue color

以上内容基于GPT创建和整理。

参考

  • 设计模式之美(作者王争,来自极客时间)

关于作者

来自一线全栈程序员nine的八年探索与实践,持续迭代中。欢迎关注“雨林寻北”或添加个人卫星codetrend(备注技术)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/742085.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode[题解] 1261. 在受污染的二叉树中查找元素

首先我们看原题 给出一个满足下述规则的二叉树: root.val 0如果 treeNode.val x 且 treeNode.left ! null,那么 treeNode.left.val 2 * x 1如果 treeNode.val x 且 treeNode.right ! null,那么 treeNode.right.val 2 * x 2 现在这个…

每日一题 第二期 洛谷 最短路径

【模板】单源最短路径(标准版) 题目链接 题目背景 2018 年 7 月 19 日,某位同学在 NOI Day 1 T1 归程 一题里非常熟练地使用了一个广为人知的算法求最短路。 然后呢? 100 → 60 100 \rightarrow 60 100→60; Ag →…

通过Cpp + Lua 解析副本与服务器的逻辑1

进入副本流程 读publicTables,OnOpenCopySceneOK()发包 private void OnOpenCopySceneOK(){GameManager.PlayerDataPool.CurSelectTier m_curSelTier;CG_OPEN_COPYSCENE_PAK pak new CG_OPEN_COPYSCENE_PAK();pak.data.SceneID (int)SCENE_DEFINE.SCENE_TDBK;p…

对云原生应用的一些思考

云原生的定义 云原生定义:云原生是一种构建和运行应用的方式,它充分利用了云计算平台的能力,如弹性扩展、自动化运维等。云原生应用具有高度的可移植性、可扩展性和可管理性,能够快速响应业务需求的变化。扩展知识:云…

mysql 存储过程 每天凌晨 定时执行任务(存储过程)

每天凌晨计算上一天的数据,并把结果存储到表中,表名按照日期动态创建 事件 event_alert_level_count create event event_alert_level_count on schedule every 1 day starts timestamp(current_date,00:00:00) do call proc_alert_level_count() ;存储…

[Java、Android面试]_02_HashMap的原理

本人今年参加了很多面试,也有幸拿到了一些大厂的offer,整理了众多面试资料,后续还会分享众多面试资料,感兴趣的朋友可收藏关注。由于时间有限,只能每天整理一点,分享一点儿! 现分享如下&#xf…

Git的两大学习目标和具体使用情景

学习的两大目标 1. 技术目标,学习一些基础的技术问题 操作原理与常见区域 掌握Git企业级应⽤,深刻理解Git操作过程与操作原理,理解⼯作区,暂存区,版本库的含义 深刻学习Git的所有操作,过程和原理&#xf…

【系统架构设计师】系统工程与信息系统基础 01

系统架构设计师 - 系列文章目录 01 系统工程与信息系统基础 文章目录 系列文章目录 前言 一、系统工程 ★ 二、信息系统生命周期 ★ 信息系统建设原则 三、信息系统开发方法 ★★ 四、信息系统的分类 ★★★ 1.业务处理系统【TPS】 2.管理信息系统【MIS】 3.决策支持系统…

VMware安装Ubuntu虚拟机

1. 安装VMware VMware中国官网:VMware - Delivering a Digital Foundation For Businesses VMware Workstation Player(官方个人免费版):VMware Workstation Player | VMware VMware Workstation Pro(商用收费版&am…

Glusterfs 常用命令

1. 启动/关闭/查看glusterd服务 #启动: systemctl daemon-reload systemctl start glusterd#开机自动启动glusterd服务: systemctl enable glusterd#关闭: systemctl stop glusterd#查看状态: systemctl status glusterd 2. 为存…

并发编程1-多线程并发编程的基本概念

多线程并发编程是指在一个程序中同时执行多个线程,每个线程都可以独立执行不同的任务,从而提高程序的效率和响应性。以下是多线程并发编程的基本概念: 线程:线程是程序中的执行单元,它可以独立运行,并拥有自…

java的23种设计模式01-设计模式介绍

一、设计模式的定义 设计模式,是指在软件设计中,被反复使用的一种代码设计经验。 目的:是为了可重用代码,提高代码的可扩展性和可维护性。 软件开发要实现可维护、可扩展,就必须尽量复用代码,并且降低代码…

GZ083 产品艺术设计赛题第四套

全国职业院校技能大赛 产品艺术设计赛项赛题四 赛项名称 产品艺术设计 英语名称 Product Art Design 赛项编号 GZ083 归属产业 数字产业 任务名称 “探索”主题儿童行李箱设计 赛项组别 中职组 高职组 □学生组 □教师组 □师生联队试点赛项 R学生组 □教师组 □…

Python相关的考试和认证

1.计算机等级考试二级python http://ncre.neea.edu.cn/ 2.蓝桥杯大赛青少年创意编程Python组 http://kid.lanqiao.cn/ 3.青少年编程能力等级_python(CERACU PAAT) http://paat.creacu.org.cn/ 4.全国青少年软件编程等级考试标准(Python1-6级) 中国电子…

CTP-API开发系列之九:行情登录及订阅代码

CTP-API开发系列之九:行情登录及订阅代码 前情回顾全局配置参数行情初始化代码行情登录行情订阅行情接收注意事项 前情回顾 CTP-API开发系列之一:各版本更新说明(持续更新) CTP-API开发系列之二:问题汇总(…

tigramite教程(六)使用TIGRAMITE 进行因果发现

使用TIGRAMITE 进行因果发现 基本用法简单玩玩万年不变的第一步:画出来调查数据依赖性和滞后函数PCMCI 因果发现错误发现率控制进一步相关的方法学教程 画图整合专家对链条的假设基准测试和验证因果效应估计数据集挑战滑动窗口分析 TIGRAMITE 是一个时间序列数据分析的python包…

【Python】新手进阶学习:os.sep---跨平台路径分隔符

【Python】新手进阶学习:os.sep—跨平台路径分隔符 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程👈 希望得到您…

挑战杯 多目标跟踪算法 实时检测 - opencv 深度学习 机器视觉

文章目录 0 前言2 先上成果3 多目标跟踪的两种方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟踪过程4.1 存在的问题4.2 基于轨迹预测的跟踪方式 5 训练代码6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习多目标跟踪 …

【Android】WebView请求HttpRequest和HttpResponse

通过重写WebViewClient默认方法,我们可以实现拦截网络请求的功能 拦截HttpRequest override fun shouldOverrideUrlLoading(view: WebView,request: WebResourceRequest ): Boolean返回true表示阻止该网页加载,返回false表示不拦截 HttpResponse ove…

MPP数据架构设计的缺点

目录 一、MPP架构 二、批处理架构和MPP架构 三、MPP架构的OLAP引擎 一、MPP架构 随着分布式、并行化技术成熟应用,MPP引擎逐渐表现出强大的高吞吐、低延时计算能力,有很多采用MPP架构的引擎都能达到“亿级秒开”。例如Impala、ClickHouse、Druid、Dor…