java设计模式学习之【桥接模式】

文章目录

  • 引言
  • 桥接模式简介
    • 定义与用途:
    • 实现方式
  • 使用场景
  • 优势与劣势
  • 桥接模式在Spring中的应用
  • 绘图示例
  • 代码地址

引言

想象你正在开发一个图形界面应用程序,需要支持多种不同的窗口操作系统。如果每个系统都需要写一套代码,那将是多么繁琐!桥接模式让这一切变得简单:它分离了应用程序的界面(抽象部分)和实际操作的操作系统(实现部分)。

桥接模式简介

桥接模式属于结构型模式,桥接模式是一种用于把抽象化与实现化解耦,使得二者可以独立变化的设计模式。它通过提供抽象层和实现层之间的桥接结构,来实现这种分离。

定义与用途:

  • 桥接模式主要用于将抽象部分与其实现部分分离,从而使它们都可以独立地变化。
  • 它通过提供一个桥接结构来实现这种分离,这种模式用于把继承关系转化为关联关系,减少类之间的耦合度。

实现方式

  • 将抽象层(Abstraction)和实现层(Implementor)分离开来。
  • 抽象层持有实现层的引用。
  • 两层之间通过桥接进行通信。

使用场景

  • 独立扩展维度: 当你希望独立扩展一个类的两个或多个维度时。例如,假设你有一个形状类,它可以有不同的颜色。通过桥接模式,形状和颜色可以独立变化,而不是为每种颜色的每种形状都创建一个类。

  • 不希望固定功能实现: 当你不希望在编译时就固定使用某个功能的实现,而是想在运行时动态切换时。桥接模式提供了这种灵活性。

  • 类数量爆炸问题: 当类的数量爆炸性增长,特别是多层继承导致系统难以管理和扩展时,桥接模式通过组合替代继承,减少类的数量。

  • 共享资源管理: 在需要管理和共享资源的场景下,如不同的界面或数据库连接,桥接模式可以帮助独立管理这些资源。

  • 隔离抽象和实现: 当一个系统的抽象和实现需要独立开发,且需要保持对客户端的透明性时,桥接模式是理想选择。例如,当一个软件需要在多个操作系统上运行,其核心功能(抽象)与操作系统的API(实现)之间可以使用桥接模式来分离。

优势与劣势

  • 优势
    分离接口及其实现部分。
    提高了系统的可扩展性。
    灵活性和维护性增强。
    客户端不受到实现部分的影响。
  • 劣势
    增加了系统的理解与设计难度。
    需要正确地识别系统中的两个独立变化的维度。

桥接模式在Spring中的应用

数据访问对象(DAO)和数据源:Spring中的数据访问对象(DAO)模式与桥接模式有着紧密的联系。DAO提供了一组与特定数据源(如JDBC、Hibernate等)独立的接口,而这些数据源则是其实现。这允许开发者在不同的持久化技术间切换,而不需要修改DAO层的代码。例如,一个应用可以从使用JDBC切换到Hibernate,DAO接口保持不变,只需更换其具体实现。

视图和控制器分离:在Spring MVC中,桥接模式通过将视图(HTML、JSP等)与控制器逻辑分离来实现。控制器处理业务逻辑,然后通过模型(Model)将数据桥接到视图层。这种分离允许开发者独立修改视图和控制器代码,提高了代码的可维护性和可测试性。

AOP(面向切面编程):Spring的AOP也是桥接模式的一个例子。AOP允许开发者定义跨多个点的横切关注点(如日志、安全等),并将这些关注点与业务逻辑(核心功能)分离。在AOP中,切面(Aspect)充当桥梁,连接独立于核心业务逻辑的横切关注点。

Spring配置与实现分离:Spring框架允许通过配置文件或注解将具体的实现与抽象的定义分离。这种分离是桥接模式的一个体现,它允许开发者在不修改代码的情况下更换组件的实现,提高了系统的灵活性和可配置性。

绘图示例

在此示例中,我们通过一个名为 DrawAPI 的接口来实现桥接模式,该接口作为桥接实现者,并且有两个具体类 RedCircle 和 GreenCircle 实现了 DrawAPI 接口。Shape 是一个抽象类,它将使用 DrawAPI 接口的对象。BridgePatternDemo(我们的演示类)将使用 Shape 类来绘制不同颜色的圆。
在这里插入图片描述
步骤 1: 创建桥接实现者接口。

public interface DrawAPI {

    public void drawCircle(int radius, int x, int y);

}

步骤 2: 创建实现 DrawAPI 接口的具体桥接实现类。

public class RedCircle implements DrawAPI {

    @Override
    public void drawCircle(int radius, int x, int y) {
        System.out.println("绘制圆形[ 颜色: 红色, 半径: " + radius + ", x: " + x + ", y: " + y + "]");
    }

}
public class GreenCircle implements DrawAPI {

    @Override
    public void drawCircle(int radius, int x, int y) {
        System.out.println("绘制圆形[ 颜色: 绿色, 半径: " + radius + ", x: " + x + ", y: " + y + "]");
    }

}

步骤 3: 创建使用 DrawAPI 接口的抽象类 Shape。

public abstract class Shape {
   protected DrawAPI drawAPI;
   
   protected Shape(DrawAPI drawAPI){
      this.drawAPI = drawAPI;
   }
   public abstract void draw();	
}

步骤 4: 创建实现 Shape 接口的具体类。

public class Circle extends Shape {
   private int x, y, radius;

   public Circle(int x, int y, int radius, DrawAPI drawAPI) {
      super(drawAPI);
      this.x = x;  
      this.y = y;  
      this.radius = radius;
   }

   public void draw() {
      drawAPI.drawCircle(radius, x, y);
   }
}

步骤 5: 使用 Shape 和 DrawAPI 类绘制不同颜色的圆。

public class BridgePatternDemo {
   public static void main(String[] args) {
      Shape redCircle = new Circle(100, 100, 10, new RedCircle());
      Shape greenCircle = new Circle(100, 100, 10, new GreenCircle());

      redCircle.draw();
      greenCircle.draw();
   }
}

在这里插入图片描述
在这个示例中,通过桥接模式,我们可以独立地改变抽象部分(Shape)和实现部分(DrawAPI)的代码。当我们想要改变圆的绘制方式时,只需要修改或增加新的 DrawAPI 实现类,而不需要改变 Shape 类及其子类。

代码地址

23种设计模式相关代码后续会逐步提交到github上,方便学习,欢迎指点:
代码地址
https://github.com/RuofeiSun/lf-23Pattern

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

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

相关文章

一小时玩转【负载均衡】

😄作者简介: 小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD 如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。 😊 座右铭:不…

流媒体方案之FFmepeg——实现物联网视频监控项目

目录 前言 一、FFmpeg介绍 二、FFmpeg简易理解 三、FFmpeg的重要概念 四、软硬件准备 五、移植、运行FFmpeg 六、运行FFmpeg 前言 最近想做一个安防相关的项目,所以跟着韦东山老师的视频来学习视频监控方案的相关知识,韦东山老师讲的课非常好&…

electron 应用图标修改

修改窗口图标 更换Electron应用程序的桌面图标 准备好你想要作为图标的图片文件,可以是PNG格式安装一个可以转换图片格式为ICO的工具,例如在线转换工具“在线转换icon图标工具”。将你的PNG图片文件上传并转换为ICO格式将转换得到的ICO文件放到你的El…

WPF绘图---Canvas中Polygon屏幕居中显示

问题描述 在一个Canvas中绘制了多个Polygon&#xff0c;由于坐标可能超出界面显示范围&#xff0c;需要将绘制的Polygon居中显示&#xff0c;并且缩放至界面大小&#xff0c;效果如下&#xff1a; xaml代码 <Borderx:Name"border"Background"#fff"Cli…

cocos 关于多个摄像机,动态添加节点的显示问题,需要动态修改layer。(跟随摄像机滚动)(神坑官网也不说明一下)

参考文章&#xff1a;Cocos 3.x 层级Layer - 简书 2D镜头跟随应该怎么实现呢 - Creator 3.x - Cocos中文社区 关于多个摄像机&#xff0c;动态添加节点的显示问题&#xff0c;需要动态修改layer&#xff1f; 场景&#xff1a;在制作摄像机跟随角色移动功能时&#xff0c;新增…

亚马逊云科技re:Invent大会,助力安全构建规模化生成式AI应用

2023亚马逊云科技re:Invent全球大会进入第三天&#xff0c;亚马逊云科技数据和人工智能副总裁Swami Sivasubramanian博士在周三的主题演讲中&#xff0c;为大家带来了关于亚马逊云科技生成式AI的最新能力、面向生成式AI时代的数据战略以及借助生成式AI应用提高生产效率的精彩分…

Echarts大屏可视化_05 折线图的定制开发

继续跟着pink老师学习Echarts相关内容&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 折线图1 1.引入 折线图选取示例地址 标题没有用到就给他删了 直接引入 注意这里是line下面的chart 获取dom元素一定不…

【计算机网络】14、DHCP

文章目录 一、概述1.1 好处 二、概念2.1 分配 IP2.2 控制租赁时间2.3 DHCP 的其他网络功能2.4 IP地址范围和用户类别2.5 安全 三、DHCP 消息3.1 DHCP discover message3.2 DHCP offers a message 如果没有 DHCP&#xff0c;IT管理者必须手动选出可用的 ip&#xff0c;这太耗时了…

抖音获客新攻略:如何通过短视频获取更多潜在客户

**一、开篇** **引子**&#xff1a;随着移动互联网的普及&#xff0c;短视频平台已成为人们获取信息、分享生活的重要渠道。抖音作为其中的佼佼者&#xff0c;以其独特的创意和精美的视频内容吸引了大量用户。对于企业而言&#xff0c;如何利用抖音获取潜在客户&#xff0c;已成…

巨擘OpenMMLab将开源综合音频生成项目:Amphion

项目地址&#xff1a;https://github.com/open-mmlab/Amphion TTS: Text-to-Speech Amphion achieves state-of-the-art performance when compared with existing open-source repositories on text-to-speech (TTS) systems. It supports the following models or architect…

网络运维与网络安全 学习笔记2023.12.1

网络运维与网络安全 学习笔记 第三十二天 今日目标 ACL原理与类型、基本ACL配置、高级ACL配置 高级ACL之ICMP、高级ACL之telnet ACL原理与类型 项目背景 为了企业的业务安全&#xff0c;要求不同部门对服务器有不同的权限 PC1不能访问Server PC2允许访问Server 允许其他所…

怎么让百度快速收录,百度SEO收录工具

百度收录对于一个网站的重要性不言而喻。拥有良好的百度收录意味着网站能够更好地被搜索引擎收录&#xff0c;为用户提供更精准的搜索结果。而怎样实现百度快速收录成为了许多网站管理员关注的焦点。 百度收录的重要性 百度是国内最大的搜索引擎之一&#xff0c;拥有数以亿计的…

春秋云镜:CVE-2022-28512

靶标介绍&#xff1a; Fantastic Blog (CMS)是一个绝对出色的博客/文章网络内容管理系统。它使您可以轻松地管理您的网站或博客&#xff0c;它为您提供了广泛的功能来定制您的博客以满足您的需求。它具有强大的功能&#xff0c;您无需接触任何代码即可启动并运行您的博客。 该…

应用于智慧金融的AI边缘计算盒子+AI算法软硬一体化方案

传统金融营业厅存在运营管理模式落后、资源投放不平衡、从业人员培训效果不达预期、客户体验割裂等普遍现象&#xff1b; 部署英码数字金融解决方案&#xff0c;将助力企业从传统金融模式快速向数字金融模式转变&#xff0c;可针对每一个客户定制个性化“一对一”服务&#xff…

Mapper文件夹在resource目录下但是网页报错找不到productMapper.xml文件的解决

报错如下&#xff1a; 我的Mapper文件夹在resourse目录下但是网页报错找不到productMapper.xml。 结构如下&#xff1a;代码如下&#xff1a;<mappers><mapper resource"com/dhu/mapper/productMapper.xml" /> </mappers> 这段代码是在mybatis-co…

Python生成器:优雅而高效的迭代器

Python是一种强大而灵活的编程语言&#xff0c;拥有丰富的标准库和特性功能&#xff0c;其中之一就是 生成器。 生成器 是Python中一种非常实用的特性&#xff0c;它能帮助我们编写高效的代码&#xff0c;尤其是在处理大量数据时&#xff0c;它能够帮助我们更有效地处理迭代任…

ESP32-Web-Server编程- 通过滑动条向 Web 提交数据

ESP32-Web-Server编程- 通过滑动条向 Web 提交数据 概述 上一节我们讲述了通过文本框向 ESP32 发送字符串、数字。有时&#xff0c;我们需要向 ESP32 发送连续的值&#xff0c;这种需求可以通过在网页端实现滑动条来实现。 需求及功能解析 本节演示如何在 ESP32 上部署一个…

使用MD5当做文件的唯一标识,这样安全么?

使用MD5作为文件唯一标识符可靠么&#xff1f; 文章目录 使用MD5作为文件唯一标识符可靠么&#xff1f;什么是MD5&#xff1f;MD5的用途MD5作为文件唯一标识的优劣优势劣势 使用MD5作为文件唯一标识的建议其他文件标识算法结束语 什么是MD5&#xff1f; MD5&#xff08;Messag…

【doccano】文本标注工具——属性级情感分析标注自己的业务数据

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ 【doccano】文本标注工具——属性级情感分析标注自己的业务数据 1.说明2.前提条件3.doccano创建项目4.添加数据集5.添加标签6.标注数据7.导出数据转换格式 1.说明 2.前提条件 确保doccano已经安装完成 可以参考文…

Elasticsearch:对时间序列数据流进行降采样(downsampling)

降采样提供了一种通过以降低的粒度存储时间序列数据来减少时间序列数据占用的方法。 指标&#xff08;metrics&#xff09;解决方案收集大量随时间增长的时间序列数据。 随着数据老化&#xff0c;它与系统当前状态的相关性越来越小。 降采样过程将固定时间间隔内的文档汇总为单…