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

news2025/2/24 16:01:48

来自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 {
    @Override
    public void fill() {
        System.out.println("Filling with red color");
    }
}
public class Blue implements Color {
    @Override
    public 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);
    }

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

    @Override
    public 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.coloradmin.cn/o/1513659.html

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

相关文章

我真是服了!你们刚开始学习的时候也是造火箭吗?能不能有一个简单的纯纯纯html模板给我学学,真的看不懂好嘛!

做一个个人博客第一步该怎么做? 好多零基础的同学们不知道怎么迈出第一步。 那么,就找一个现成的模板学一学呗,毕竟我们是高贵的Ctrl c v 工程师。 但是这样也有个问题,那就是,那些模板都,太!…

弧形导轨的设计要求

制造业设备种类越来越多,非标自动化设备渐渐成了主力市场,其中弧形导轨线体作为非标自动化运输中的基石,承担了运输,定位,特殊工位组装,其设计要求也非常严格。 1、精度要求:弧形导轨需要具备高…

大数据 - HBase《一》- Hbase基本概念

目录 1.1. Hbase简介 1.2 Hbase,Hive, Mysql对比 1.3 Hbase数据模型 🥙region(区域) 🥙rowkey(行键) 🥙列族(column family) 🥙列(column Qualifier) 🥙版本(version)-默认按…

如何仅用3行代码,搞定业务敏感数据加解密?

01 引子:一个数据安全的故事 一个风和日丽的早上,某家快递物流公司内。 张老板看着电脑屏幕,眉头紧锁。电脑屏幕上赫然写着,“疑似45亿条个人信息泄露,电商物流行业数据安全警铃再响”。据传,…

代码学习记录18

随想录日记part18 t i m e : time: time: 2024.03.13 主要内容:今天的主要内容是二叉树的第七部分,主要涉及二叉搜索树的最近公共祖先 ;二叉搜索树的最近公共祖先;删除二叉搜索树中的节点 。 23…

国内使用GPT4的5种解决方案,最后一个是全场最佳

ChatGPT4是目前世界上最先进的自然语言处理模型 大家都知道ChatGPT4特别好用 我个人来说,基本上每天都会用GPT来查资料、写代码和润色文章 但是在国内,使用ChatGPT4,是有一定门槛的 门槛一 mo法问题 ChatGPT的网站,国内是无法访问…

javaEE13(网站第8章两个课后题)

1、对“jspservletjavabean实现分页查询”功能做如下补充: (1)记录批量删除:每个记录前添加复选框,点击批量删除,删除选中记录。 增加跳转到任意页功能。用户可改变每页记录条数。 页面&am…

ImportError: Plotly express requires pandas to be installed.

在 Python3 环境下,使用 plotly 绘图时,发生了如下错误: ImportError: Plotly express requires pandas to be installed. 通过排查发现是使用了折行导入时报错的: import plotly.express as px 通过检索找到了解决办法&#xff0…

VScode Error Lens插件

安装完成之后,当我们输入一些错误的语法格式的时候,它都会有一些提示! 一开始是英文提示 修改为中文提示 设置搜索 typescript.local

【gpt实践】李某的AI课程值199吗

先说个人的答案:不值。但也不是说毫无价值,只是他的价值没那么高。 文末分享该课程,大家有兴趣可以看看,该课程是否有价值。 “清华博士”推出的199元的AI课程销售额竟然突破了5000万。这一数字让人惊叹,也引发了人们…

免费AI软件开发工具测评:iFlyCode VS CodeFlying

前言 Hello,各位看官,今天为大家带来两款人工智能的软件开发工具的测评,他们分别是iFlyCode和CodeFlying,我相信当大家看到这两款产品名字的时候不禁都会有些好奇,两个产品都有Code 和Fly两个元素,那他们之…

Consul 配置持久化

当我们在consul的key-value中配置了几个字段 访问后的结果: 但是当我们在控制台输入命令重启consul服务后: consul agent -dev 刚刚设置的key-value值便消失不见了 此时就要进行 consul 持久化配置. 第一步:在consul文件夹下创建 1.空文件夹mydata 2.新建文件consul_star…

电脑截图的方式有哪些?

针对使用电脑截图,可以下个截图软件,到目前位置感觉用得不错的是Snipaste这一款,看下图所示。下载链接 Snipaste - 截图 贴图 需要根据自己的电脑配置,选择下载对应的版本。就不详细介绍怎么安装了。 具体操作:在电脑…

在linux上部署yolov5和安装miniconda3

第一步:安装miniconda3 官网:Miniconda — Anaconda documentation 这四个命令快速而安静地安装最新的64位版本的安装程序,然后自行清理。要为Linux安装Miniconda的不同版本或体系结构,请在wget命令中更改.sh安装程序的名称。 …

安卓 OpenGL ES 学习笔记

文章目录 OpenGL 学习笔记OpenGL 是什么?OpenGL ES是什么?怎么用?hello world如何实现动画效果 参考文章 OpenGL 学习笔记 OpenGL 是什么? OpenGL(Open Graphics Library)是一个跨平台的图形编程接口&…

MySQL8 设置大小写敏感

问题描述 今天对我本地的数据库迁移服务器上,完成之后启动项目报错 说数据库中不存在 quartz_LOCKS 这张表 我打开服务器上面的数据上面展示的表名是 quartz_LOCKS,然后通过查询 lower_case_table_names 配置可知 show variables like lower_case_tabl…

图片格式转换怎么操作?这一个方法快快收藏

图片格式转换能够改变图片的质量、大小兼容性。不同的图片格式用途也不同,当我们需要转换图片格式的时候要怎么操作呢?下面,小编给大家分享一款操作简单,小白也能轻松上手的图片转换器(https://www.yasuotu.com/geshi&…

[ThinkPHP]Arr返回1

$detailId (int)Arr::get($detail, null); var_dump($detailId); 打印结果:int(1) 原因: vendor/topthink/think-helper/src/helper/Arr.php

Spring启动“--”设置参数没生效

现象 在idea中启动SpringBoot项目时,使用“--”设置的启动参数没有生效,如修改端口号“--server.port8082” 原因 排查发现是因为在使用SpringApplication.run启动项目时,没有将args参数传入run方法。 修复方案 SpringApplication.run参数中…

【漏洞复现】宏景HCM downlawbase SQL注入漏洞

0x01 产品简介 宏景人力资源管理软件是一款人力资源管理与数字化应用相融合,满足动态化、协同化、流程化、战略化需求的软件。 0x02 漏洞概述 宏景HCM downlawbase 接口处存在SQL注入漏洞,未经过身份认证的远程攻击者可利用此漏洞执行任意SQL指令&…