跟着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 {
    @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(备注技术)。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Ubuntu-20.04】OpenCV-3.4.16的安装并对图片与视频处理

【Ubuntu-20.04】OpenCV-3.4.16的安装并对图片与视频处理 一、安装OpenCV-3.4.161.下载OpenCV-3.4.16安装包2.将安装包放到/home,并解压3.使用 cmake 安装 opencv4.配置环境5.查看 opencv 的版本信息 二、处理图片(一)创建文件夹 code &#…

深入理解Python中的面向对象编程(OOP)【第129篇—Scikit-learn的入门】

深入理解Python中的面向对象编程(OOP) 在Python编程领域中,面向对象编程(Object-Oriented Programming,简称OOP)是一种强大而灵活的编程范式,它允许开发者以对象为中心组织代码,使得…

错误: 找不到或无法加载主类 Hello.class

在运行这串代码 public class Hello{ public static void main(String[] args){ System.out.println("Hello world!"); } } 的时候出现报错:错误: 找不到或无法加载主类 Hello.class 入门级错误 1.公共类的文件名和类名不一致 hello.j…

2024国际数字体育科技与电子竞技博览会在深圳前海隆重召开

随着科技的飞速发展,数字体育与电子竞技日益成为全球关注的焦点。3月2日,由中国电子商会数字体育与电子竞技专业委员会指导、赛艾特会展(深圳)有限公司、深圳国合华鑫科技发展有限公司、通联(深圳)数字科技集团有限公司联合主办的2024国际数字体育科技与电子竞技博览会新闻发布…

面试题 --- jdbc执行流程、MyBatis执行流程、MyBatis拦截器配置流程

jdbc执行流程 1. 注册驱动 2. 创建数据库操作对象 3. 执行sql语句 4 .处理操作结果 5 .关闭连接释放资源 MyBatis 执行流程 Executor执行器、MappedStatement 对象、 StatementHandler 语句处理器 关系可以用以下步骤概括 用户通过 SqlSession 调用一个方法,Sq…

音视频开发之旅(75)- AI数字人进阶--GeneFace++

目录 1.效果展示和玩法场景 2.GeneFace原理学习 3.数据集准备以及训练的过程 5.遇到的问题与解决方案 6.参考资料 一、效果展示 AI数字人进阶--GeneFace(1) AI数字人进阶--GeneFace(2) 想象一下,一个专为你打造的…

DVWA 靶场搭建

文章目录 1 DVWA 简介2 DVWA 安装 1 DVWA 简介 DVWA(Damn Vulnerable Web App)是一个基于 “PHP MySQL” 搭建的Web应用程序,皆在为安全专业人员测试自己的专业技能和工具提供合法的环境,帮助Web开发者更好地理解Web应用安全防范…

fs模块 文件写入 之 异步写入与同步写入

一、fs模块介绍: fs(file system)模块是nodejs提供的用于访问本地文件系统的功能模块,它使得运行于nodejs环境下的JavaScript具备直接读写本地文件的能力。 fs模块是nodejs的核心模块之一,只要安装了nodejs&#xff…

华为配置OSPF的Stub区域示例

配置OSPF的Stub区域示例 组网图形 图1 配置OSPF Stub区域组网图 Stub区域简介配置注意事项组网需求配置思路操作步骤配置文件 Stub区域简介 Stub区域的ABR不传播它们接收到的自治系统外部路由,在Stub区域中路由器的路由表规模以及路由信息传递的数量都会大大减少…

【C++】string进一步介绍

个人主页 : zxctscl 如有转载请先通知 文章目录 1. 前言2. 迭代器2.1 反向迭代器2.2 const对象迭代器 3. Capacity3.1 size和length3.2 max_size3.3 capacity3.4 clear3.5 shrink_to_fit (了解即可)3.6 reserve3.7 resize 4. Element access4…

一台服务器部署两个独立的mysql实例

🍁博主简介: 🏅云计算领域优质创作者 🏅2022年CSDN新星计划python赛道第一名 🏅2022年CSDN原力计划优质作者 🏅阿里云ACE认证高级工程师 🏅阿里云开发者社区专…

STM32平替GD32有多方便

众所周知, GD32一直模仿STM32,从未被超越。 我最近公司使用的GD32E230C6T6 这款芯片有48个引脚。 属于小容量的芯片。 我有一个用STM32写的代码,之前是用的 STM32F103CB 这款芯片是中容量的。 不过在keil中,只需要这两步,就能使用原来的逻辑,几乎不用修改代码。 1. …

【Swing】Java Swing实现省市区选择编辑器

【Swing】Java Swing实现省市区选择编辑器 1.需求描述2.需求实现3.效果展示 系统:Win10 JDK:1.8.0_351 IDEA:2022.3.3 1.需求描述 在公司的一个 Swing 的项目上需要实现一个选择省市区的编辑器,这还是第一次做这种编辑器&#xf…

【数据结构】二叉树OJ题目

965. 单值二叉树 如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。 只有给定的树是单值二叉树时,才返回 true;否则返回 false。 示例 1: 输入:[1,1,1,1,1,null,1] 输出:true示例 2&#x…

考研复试C语言篇

第一章 概述 1.1什么是程序 为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的合集。 1.4C语言的特点 代码级别的跨平台:由于标准的存在,使得几乎同样的C代码可用于多种操作系统,也适用于多种机型。使允许直接访问物理地址…

Java基础 - 9 - 集合进阶(一)

集合是一种容器,用来装数据的,类似于数组,但集合的大小可变,开发中非常常用 为了满足不同的业务场景需求,Java除了ArrayList还提供了很多不同特点的集合给我们选择 一. 集合的体系结构 集合可以分为两类:…

案例--某站视频爬取

众所周知,某站的视频是: 由视频和音频分开的。 所以我们进行获取,需要分别获得它的音频和视频数据,然后进行音视频合并。 这么多年了,某站还是老样子,只要加个防盗链就能绕过。(防止403&#xf…

Git之版本回退

文章转载于:https://www.jianshu.com/p/3020740561a8 以前,如果是要去除某一块功能,我都是选择性删除,选择性注释,然后前后逻辑各种查看,各种比较。每一次,改完这些我总感觉心好累啊&#xff01…

Prompt进阶3:LangGPT(构建高性能质量Prompt策略和技巧2)--稳定高质量文案生成器

Prompt进阶3:LangGPT(构建高性能质量Prompt策略和技巧2)–稳定高质量文案生成器 1.LangGPT介绍 现有 Prompt 创建方法有如下缺点: 缺乏系统性:大多是细碎的规则,技巧,严重依赖个人经验缺乏灵活性:对他人分享的优质 …

数据结构 day2

1:思维导图 2&#xff1a;计算结构体大小 3&#xff1a;大小端存储 &#xff08;1&#xff09;&#xff1a;数据溢出 1 #include <stdio.h>2 #include <string.h>3 #include <stdlib.h>4 int main(int argc, const char *argv[])5 {6 short a 0x1234;…