07 设计模式-结构型模式-桥接模式

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

这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类,这两种类型的类可被结构化改变而互不影响。

桥接模式的目的是将抽象与实现分离,使它们可以独立地变化,该模式通过将一个对象的抽象部分与它的实现部分分离,使它们可以独立地改变。它通过组合的方式,而不是继承的方式,将抽象和实现的部分连接起来。

我们通过下面的实例来演示桥接模式(Bridge Pattern)的用法。其中,可以使用相同的抽象类方法但是不同的桥接实现类,来画出不同颜色的圆。

设计模式,最近持续更新中,如需要请关注

如果你觉得我分享的内容或者我的努力对你有帮助,或者你只是想表达对我的支持和鼓励,请考虑给我点赞、评论、收藏。您的鼓励是我前进的动力,让我感到非常感激。

文章目录

  • 1 概要
  • 2 实现
  • 3 Demo代码
  • 4 开发案例-思考

1 概要

意图
用于将抽象部分与实现部分分离,使得它们可以独立地变化。。

主要解决的问题
避免使用继承导致的类爆炸问题,提供更灵活的扩展方式。

使用场景
当系统可能从多个角度进行分类,且每个角度都可能独立变化时,桥接模式是合适的。

实现方式

  • 分离多角度分类:将不同角度的分类逻辑分离,允许它们独立变化。
  • 减少耦合:降低抽象与实现之间的耦合度。

关键代码

  • 抽象类:定义一个抽象类,作为系统的一部分。
  • 实现类:定义一个或多个实现类,与抽象类通过聚合(而非继承)关联。

优点

  • 抽象与实现分离:提高了系统的灵活性和可维护性。
  • 扩展能力强:可以独立地扩展抽象和实现。
  • 实现细节透明:用户不需要了解实现细节。

缺点

  • 理解与设计难度:桥接模式增加了系统的理解与设计难度。
  • 聚合关联:要求开发者在抽象层进行设计与编程。

使用建议

  • 当系统需要在抽象化角色和具体化角色之间增加灵活性时,考虑使用桥接模式。
  • 对于不希望使用继承或因多层次继承导致类数量急剧增加的系统,桥接模式特别适用。
  • 当一个类存在两个独立变化的维度,且这两个维度都需要扩展时,使用桥接模式。

注意事项
桥接模式适用于两个独立变化的维度,确保它们可以独立地扩展和变化。

结构
以下是桥接模式的几个关键角色:

  • 抽象(Abstraction):定义抽象接口,通常包含对实现接口的引用。
  • 扩展抽象(Refined Abstraction):对抽象的扩展,可以是抽象类的子类或具体实现类。
  • 实现(Implementor):定义实现接口,提供基本操作的接口。
  • 具体实现(Concrete Implementor):实现实现接口的具体类。

2 实现

我们有一个作为桥接实现的 DrawAPI 接口和实现了 DrawAPI 接口的实体类 RedCircle、GreenCircle。Shape 是一个抽象类,将使用 DrawAPI 的对象。BridgePatternDemo 类使用 Shape 类来画出不同颜色的圆。
在这里插入图片描述

3 Demo代码

创建桥接实现接口。

public interface DrawAPI {public void drawCircle(int radius, int x, int y);
}

创建实现了 DrawAPI 接口的实体桥接实现类。

public class GreenCircle implements DrawAPI {@Overridepublic void drawCircle(int radius, int x, int y) {System.out.println("Drawing Circle[ color: green, radius: "+ radius + ", x: " + x + ", " + y + "]");}
}
public class RedCircle implements DrawAPI {@Overridepublic void drawCircle(int radius, int x, int y) {System.out.println("Drawing Circle[ color: red, radius: "+ radius + ", x: " + x + ", " + y + "]");}
}

使用 DrawAPI 接口创建抽象类 Shape。

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

创建实现了 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);}
}

使用 Shape 和 DrawAPI 类画出不同颜色的圆。

/*1 将抽象部分与实现部分分离,使它们都可以独立的变化。2 在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。使用场景: 1、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。2、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。 3、一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。注意事项:对于两个独立变化的维度,使用桥接模式再适合不过了。<p>总结:Shape【抽象部分】: 抽象类,1 对子类开放个构造方法,构造时,需初始化成员变量 DrawAPI 【接口,用它来扩展】。Circle【实现部分,桥接的实现者】: 实现类,1 对外提供构造方法,需要传入抽象父类的成员变量对象 DrawAPI【接口】2 重写父类的方法,通过传入的接口来调用。实现了桥接DrawAPI【桥,载体】: 抽象接口1 定义统一的抽象接口,供子类来实现RedCircle、GreenCircle:具体的实现类1 继承 DrawAPI ,可以作为参数传入的到 Circle对象中,在circle对象调用draw()方法时实际上,走的是这两个实现类的具体方法*/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就起到了桥接作用。做到了抽象和实现向分离

4 开发案例-思考

1 在算法执行服务构造TaskEntity时,使用了抽象工厂模式,里面创建后处理对象时,需要传入输出结果数据源(抽象),不同的数据源处理方式是不同的,做到抽象和实现向分离

   public static ResultHandle getResultHandle(CalculateParam calculateParam, ScriptParam scriptParam) {// 【预留】 设置结果集存放的数据源。目前所有的算法都有数据集,取数据集的第一个数据源作为结果上传的数据源OutputDataSource outputDataSource = getOutDataSource(calculateParam.getDataSets().get(0));if (Constants.CustomizedAlgoId.POTENTIAL_GUEST_ALGO_ID.equals(calculateParam.getAlgoId())) {// 定制化的处理方式,需要走特有的处理方式。此类算法,只能提前预置后return new PotentialGuestResultHandle(scriptParam, outputDataSource);} else {// 任务结果走默认处理方式,此类算法可以通过算法管理界面可以添加return new ResultHandle(scriptParam, outputDataSource);}}

2 桥接模式主要思想是抽象和实现相分离。设计对象时,属性定义为抽象接口,在实例化时才传入具体的实现类,可以做到随意组合。

如果这么理解,在创建TaskEntity时,就使用了桥接模式。
在这里插入图片描述

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

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

相关文章

JAVA单列集合

List系列集合:添加的元素是 有序、可重复、有索引 Set系列集合:添加的元素是 无序、不重复、无索引 Collection Collection是单列集合的接口&#xff0c;它的功能是全部单列集合都可以继承使用的 public boolean add(E e) 把给定的对象添加到当前集合中 public void …

Spring MVC(下)

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:MySQL数据库 JavaEE专栏:JavaEE 关注博主带你了解更多JavaEE知识 目录 1.响应 1.1 返回静态页面 1.2 返回数据ResponseBody 1.3 返回HTML代码⽚段 1.4 返回JSON 1.5 设置状态码 1.6 设置Header 2 . …

【文献及模型、制图分享】基于国际湿地城市视角的常德市湿地保护修复成效与归因分析及其政策启示

文献介绍 《湿地公约》提出的“国际湿地城市”认证是促进湿地保护修复的新举措。以国际湿地城市常德市为例&#xff0c;基于2000—2022年15 m空间分辨率湿地分类数据&#xff0c;监测常德市湿地保护修复逐年动态变化&#xff0c;定量分析湿地保护修复驱动因素的重要性和贡献率…

K8s中TSL证书如何续期

TSL是什么 K8s中的作用是什么&#xff1f; 在 Kubernetes&#xff08;K8s&#xff09;中&#xff0c;TSL 指的是 Transport Layer Security&#xff0c;也就是传输层安全协议。它是用来保护在网络上传输的数据的安全性和隐私性。 TSL 在 Kubernetes 中的作用包括&#xff1a;…

第1讲(ASP.NET Core 6 Web Api 开发入门):第一个Web Api项目

一、运行模板项目 二、验证模板项目的api 法1&#xff1a;直接在网页上进行验证api 法2&#xff1a;通过命令行验证api 复制下图的Curl语句&#xff0c;打开命令行进行粘贴。&#xff08;对于windows系统&#xff0c;需要把换成"&#xff0c;再去掉所有的/&#xff0c;最…

一文了解AOSP是什么?

一文了解AOSP是什么&#xff1f; AOSP基本信息 基本定义 AOSP是Android Open Source Project的缩写&#xff0c;这是一个由Google维护的完全免费和开放的操作系统开发项目。它是Android系统的核心基础&#xff0c;提供了构建移动操作系统所需的基本组件。 主要特点 完全开源…

【景观生态学实验】实验一 ArcGIS地理数据处理及制图基础

实验目的 1.掌握ArcGIS软件基本操作&#xff1a;通过实验操作与学习&#xff0c;熟练掌握ArcGIS软件相关的基本操作&#xff0c;包括界面熟悉、工具栏使用、数据的加载和保存、基本数据处理操作等; 2.掌握如何使用ArcGIS进行影像拼接及裁剪&#xff1a;通过实验操作与学习&am…

传知代码-ChatGPT多模态命名实体识别

代码以及视频讲解 本文所涉及所有资源均在传知代码平台可获取 ChatGPT辅助细化知识增强&#xff01; 多模态命名实体识别&#xff08;MNER&#xff09;最近引起了广泛关注。 用户在社交媒体上生成大量非结构化内容&#xff0c;主要由图像和文本组成。这些帖子具有与社交媒体相…

GISBox vs CesiumLab:哪款GIS工具更适合你的项目?

在地理信息系统&#xff08;GIS&#xff09;领域&#xff0c;越来越多的用户开始关注GIS工具箱的选择&#xff0c;其中GISBox和CesiumLab是两款备受推崇的产品。那么&#xff0c;哪一款更适合你的需求呢&#xff1f;本文将从功能、使用体验和应用场景等方面&#xff0c;对GISBo…

产品如何实现3D展示?具体步骤如下

产品实现3D展示主要依赖于先进的3D建模与展示技术。以下是产品实现3D展示的具体步骤和方法&#xff1a; 一、3D建模 使用专业的3D建模软件&#xff0c;如Blender、Maya、3ds Max等&#xff0c;这些软件提供了丰富的建模工具和材质编辑器&#xff0c;能够创建出高精度的3D模型…

Python基于amazon/chronos-t5-base的预训练模型离线对时间系列数据的未来进行预测

Python基于预训练模型对时间系列数据的未来进行预测 导入库 %matplotlib inline import matplotlib.pyplot as plt import numpy as np import pandas as pd import torch from chronos import ChronosPipeline from tqdm.auto import tqdm from autogluon.timeseries import…

电脑定期运行某个程序

1、右键计算机-管理&#xff0c;点击任务计划程序&#xff0c;再点击创建基本任务&#xff1b; 2、写名称&#xff0c;下一步 3、选择任务开始计划&#xff0c;下一步 4、选择触发时间&#xff0c;下一步 5、选择启动程序&#xff0c;下一步 6、选择运行的程序&#xff0c;下一…

模型拆解(一):DBINet、GCPANet、CPD、ACCoNet、FPS-U2Net

文章目录 一、DBINet1.1编码器模块&#xff1a;ResNet50PVT双分支结构1.2解码器模块&#xff1a;自细化模块SR的应用1.3DFM&#xff1a;双分支融合模块1.4转换器模块&#xff1a;调整编码器输出至解码器中1.5深度监督损失函数 二、GCPANet2.1编码器模块&#xff1a;ResNet50主干…

uniapp移动端优惠券! 附源码!!!!

本文为常见的移动端uniapp优惠券&#xff0c;共有6种优惠券样式&#xff08;参考了常见的优惠券&#xff09;&#xff0c;文本内容仅为示例&#xff0c;您可在此基础上调整为你想要的文本 预览效果 通过模拟数据&#xff0c;实现点击使用优惠券让其变为灰色的效果&#xff08;模…

来自骨关节炎计划的膝关节MR图像的自动异常感知3D骨骼和软骨分割|文献速递-基于生成模型的数据增强与疾病监测应用

Title 题目 Automated anomaly-aware 3D segmentation of bones and cartilages in kneeMR images from the Osteoarthritis Initiative 来自骨关节炎计划的膝关节MR图像的自动异常感知3D骨骼和软骨分割 Background 背景 近年来&#xff0c;多个机器学习算法被提出用于图像…

windows|常见的文件伪装方法

几种常见的文件伪装方法&#xff1a; 扩展名伪装unicode字符伪装压缩包伪装隐写术 方法仅限于学习目的&#xff0c;不用于任何恶意或非法用途。 ———— 一、扩展名伪装&#xff1a;假装是另一种类型的文件 修改文件的扩展名&#xff0c;使得文件看起来像其他类型的文件&a…

python常用设计模式,单例模式和工厂设计模式

python常用设计模式&#xff0c;单例和工厂设计模式Demo 单例模式 单例设计模式是一种创建型设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供一个全局访问点来获取该实例。 应用场景&#xff1a;日志记录、线程池、缓存等 优点&#xff1a; 全局访问&…

洛谷题解 - P1162 填涂颜色

目录 填涂颜色题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示题解思路代码 填涂颜色 题目描述 由数字 0 0 0 组成的方阵中&#xff0c;有一任意形状的由数字 1 1 1 构成的闭合圈。现要求把闭合圈内的所有空间都填写成 2 2 2。例如&#xff1a; 6 6 6\times…

python的散列类型与字符编码

文章目录 一、 初识散列类型(无序序列)二、认识集合集合的方法增删 二、认识字典字典方法增删改查 声明空变量 三、字符编码元组名() #声明一个空元组 一、 初识散列类型(无序序列) 数据类型分为3种: python的序列类型有好几种&#xff0c;之前的博文讲到了两种类型 1.数值类型…

Appium中的api(一)

目录 1.基础python代码准备 1--参数的一些说明 2--python内所要编写的代码 解释 2.如何获取包名和界面名 1-api 2-完整代码 代码解释 3.如何关闭驱动连接 4.安装卸载app 1--卸载 2--安装 5.判断app是否安装 6.将应用放到后台在切换为前台的时间 7.UIAutomatorViewer的使用 1--找…