结构设计模式 - 桥接设计模式 - JAVA

桥接设计模式

    • 一. 介绍
    • 二. 桥接模式示例
      • 2.1 定义实现部分和具体实现
      • 2.2 定义抽象部分和细化抽象部分
      • 2.3 测试
      • 2.4 解释
    • 三. 结论

前言

这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。

作者:神的孩子都在歌唱

一. 介绍

百度百科: 桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(interface)模式。

说实话,一开始我没法理解百度百科这句话,所以我找了几个案例文章学习,那么,我就拿最经常看到的 绘制不同颜色的形状 这个案例去理解吧。

以下是网上看到的案例

注意:以下的案例是反例

现在有一个需求,需要创建不同的图形,并且每个图形都有可能会有不同的颜色。我们可以利用继承的方式来设计类的关系:

image-20200207194617620

我们可以发现有很多的不同形状颜色的类,假如我们再增加一个形状或再增加一种颜色,就需要创建更多的类。

试想,在一个有多种可能会变化的维度的系统中,用继承方式会造成类爆炸,扩展起来不灵活。每次在一个维度上新增一个具体实现都要增加多个子类。为了更加灵活的设计系统。 我们此时可以考虑使用桥接模式, 将抽象与实现分离,使它们可以独立变化。。

个人理解:通过上面的反例,大概知道桥接模式具体要做什么了,它的理念其实就是将要实现对象的类 (比如Shape类)进行抽象化将颜色独立出来实现(比如 black,white颜色),使得抽象部分(Shape)实现部分(color)可以独立地扩展和变化,实现解耦

作用是了解了,但是为啥叫桥接模式呢?是不是我没理解透,这个取名有啥含义,有知道的大佬补充一下

二. 桥接模式示例

概念理解了,那么我们看看代码如何实现吧,假设我们需要绘制不同颜色的形状,使用桥接模式将形状和颜色解耦。

image-20200207194617620

2.1 定义实现部分和具体实现

color接口

/*** @author chenyunzhi* @date 2024/5/31 16:37* @Description 定义颜色的接口*/
public interface Color {/*** 应用颜色*/void applyColor();
}

BlackColor类

/*** @author chenyunzhi* @date 2024/5/31 17:01* @Description 黑色*/
public class BlackColor implements Color{@Overridepublic void applyColor() {System.out.println("黑色");}
}

WhiteColor类

/*** @author chenyunzhi* @date 2024/5/31 16:59* @Description 白色*/
public class WhiteColor  implements Color{@Overridepublic void applyColor() {System.out.println("白色");}
}

2.2 定义抽象部分和细化抽象部分

shape类

/*** @author chenyunzhi* @date 2024/5/31 17:02* @Description 定义形状的抽象接口*/
abstract class Shape {protected Color color;public Shape(Color color) {this.color = color;}// 定义抽象画图方法abstract void draw();
}

Circle类

/*** @author chenyunzhi* @date 2024/5/31 17:07* @Description 圆形*/
public class CircleShape extends Shape{public CircleShape(Color color) {super(color);}@Overridevoid draw() {System.out.print("获得圆形的颜色是");color.applyColor();}
}

Rectangle类

/*** @author chenyunzhi* @date 2024/5/31 17:13* @Description 长方形*/
public class RectangleShape extends Shape{public RectangleShape(Color color) {super(color);}@Overridevoid draw() {System.out.print("获得长方形颜色是");color.applyColor();}
}

2.3 测试

/*** @author chenyunzhi* @date 2024/5/31 17:15* @Description*/
public class BridgePatterTest {public static void main(String[] args) {CircleShape circleShape = new CircleShape(new BlackColor());circleShape.draw();RectangleShape rectangleShape = new RectangleShape(new WhiteColor());rectangleShape.draw();}
}

结果如下

image-20240531173030191

2.4 解释

  • 实现部分(Implementor)Color 接口及其具体实现 RedColorGreenColor,定义了颜色的应用方式。
  • 抽象部分(Abstraction)Shape 抽象类,包含一个对 Color 接口的引用,并定义了一个抽象的 draw 方法。
  • 细化抽象部分(Refined Abstraction)CircleRectangle 类,具体实现了 Shape 抽象类中的 draw 方法,调用 color.applyColor() 来应用颜色。

三. 结论

  1. 当抽象和实现都可以独立地具有不同的层次结构并且我们希望对客户端应用程序隐藏实现时,可以使用桥接设计模式。
  2. 桥接模式中的抽象部分主要是定义了对象的高层行为和属性,通过引用实现部分的接口,使得抽象部分和实现部分可以独立地扩展和变化。这样就实现了系统的解耦,提高了代码的灵活性和可维护性。

作者:神的孩子都在歌唱

本人博客:https://blog.csdn.net/weixin_46654114

转载说明:务必注明来源,附带本人博客连接。

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

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

相关文章

Spring MVC详解(上)

一、Spring MVC初步认识 1.1介绍 Spring MVC是Spring Framework提供的Web组件,全称是Spring Web MVC,是目前主流的实现MVC设计模式的框架,提供前端路由映射、视图解析等功能 Java Web开发者必须要掌握的技术框架 1.2MVC是什么 MVC是一种软件架构思想…

Vue项目中实现骨架占位效果-demo

创建组件 Skeleton.vue <template><div class"skeleton"><div class"skeleton-item" v-for"n in count" :key"n"></div></div> </template><script> export default {props: {count: {ty…

Ruby语言建立Web服务器

这次选择的Web服务器是Nginx&#xff0c;Nginx非常适合处理静态资源&#xff0c;如图片、CSS和JS文件,通过减轻应用服务器的负担&#xff0c;Nginx使得Ruby on Rails应用能够更高效地运行. 安装启动Nginx服务器 sudo apt install nginx nginx -v 启动Nginx服务器&#xff1a;…

(3)图像识别yolov5—训练自定义模型

目录 1. 准备数据集 (1) 收集图像: (2) LabelImg标注图像: 2. 模型训练 3. 评估模型 4. 使用模型进行推理 5. 完整文件下载 YOLOv5 是一个用于目标检测的深度学习模型,它非常流行且易于使用。如果你想使用 YOLOv5 训练自定义的模型,以下是一个基本的步骤指南…

16.重启docker服务,容器全部退出的解决办法

重启docker服务&#xff0c;容器全部退出的解决办法 方法一&#xff1a;docker run --restartalways 表示局部的&#xff0c;也就是针对指定容器进行开启自启动容器 方法二&#xff1a;“live-restore”: true 表示全局的&#xff0c;一般不建议使用 docker server配置文件…

【漏洞复现】畅捷通T+ keyEdit SQL注入漏洞

免责声明&#xff1a; 本文内容旨在提供有关特定漏洞或安全漏洞的信息&#xff0c;以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步&#xff0c;并非出于任何恶意目的。阅读者应该明白&#xff0c;在利用本文提到的漏洞信息或进行相关测…

Java 集合框架:LinkedList 的介绍、使用、原理与源码解析

大家好&#xff0c;我是栗筝i&#xff0c;这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 014 篇文章&#xff0c;在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验&#xff0c;并希望进…

AI大模型在运动项目的深度融合和在穿戴设备的实践及未来运动健康技术发展

文章目录 1. 技术架构2. 模型选择2.1 LSTM&#xff08;长短期记忆网络&#xff09;2.2 CNN&#xff08;卷积神经网络&#xff09;2.3 Transformer 3. 数据处理数据预处理 4. 实时性要求4.1 边缘计算4.2 模型优化 5. 数据隐私与安全6. 深入分析AI大模型在穿戴设备的应用和未来发…

计算机专业的未来展望

身份角度一&#xff1a;一名曾经的计算机专业学生  作为一名曾经的计算机专业学生&#xff0c;我认为计算机相关专业仍然是一个值得考虑的选择。随着科技的飞速发展&#xff0c;计算机行业的需求只会越来越高&#xff0c;因此&#xff0c;无论是在就业前景还是个人发展方面&a…

CD4069做陶瓷和晶体振荡器的试验初步

在面包板上面&#xff0c;供电5v。尝试用4069做晶体振荡器 465K&#xff0c;1M陶瓷&#xff0c;不起振 4M陶瓷&#xff0c;不起振&#xff0c;在1脚加上68pf电容后起振&#xff0c;但幅度没有后面写的10M陶瓷和17.6的晶振的幅度大 10M陶瓷&#xff0c;起振ok 16M陶瓷&#…

【面试干货】String、StringBuilder、StringBuffer 的区别

【面试干货】String、StringBuilder、StringBuffer 的区别 1、String2、StringBuffer3、StringBuilder4、性能对比5、使用建议 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java中&#xff0c;String、StringBuilder和StringBuffer是用…

Linux经典常见常用命令50条

文章目录 基础命令1. ls2. cd3. pwd4. cp5. mv6. rm7. echo8. cat9. head10. tail 系统信息与管理命令11. ps12. top13. htop14. kill15. df16. du17. uname18. hostname19. uptime20. who21. man 文件权限与所有权命令22. chmod23. chown 网络管理命令24. ping25. ifconfig26.…

MySQL面试重点-1

1. 数据库基础知识&#xff1a; DDL、DML、DQL、DCL的概念与区别&#xff1f; DDL&#xff08;数据定义语言&#xff09;&#xff1a;创建&#xff08;CREATE&#xff09;数据库中的各种对象&#xff1a;表、视图、索引等DML&#xff08;数据操纵语言&#xff09;&#xff1a…

Vue53-Todo-list案例

一、需求&#xff1a; 二、组件的划分&#xff1a;按照功能划分 组件起名&#xff0c;不要和html内置元素重名&#xff01; Vue鼓励组件名用多个单词。 三、组件化编码流程 3-1、实现静态组件 将各个组件的基本框架写好&#xff0c;并在App.vue文件中进行引入和注册。 将已有…

[Day 8] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

智能合約與去中心化應用 智能合約&#xff08;Smart Contracts&#xff09;是一種基於區塊鏈技術的程式碼&#xff0c;旨在自動執行、驗證或執行合約的內容或執行條款。透過智能合約&#xff0c;合約中的各方可以在無需第三方信任的情況下進行交易&#xff0c;實現自動化、透明…

AI数据分析:集中度分析和离散度分析

在deepseek中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个Python脚本编写的任务&#xff0c;具体步骤如下&#xff1a; 读取Excel表格&#xff1a;"F:\AI自媒体内容\AI行业数据分析\toolify月榜\toolify2023年-2024年月排行榜汇总数据.xlsx&qu…

UniVue第一个版本发布说明

今天终于发布第一个版本了&#xff0c;爆肝了这么多天&#xff0c;对之前的代码优化重构&#xff0c;今天终于做完了&#xff0c;第一个版本的核心基础功能已经全部完成&#xff01; github仓库 稳定版本仓库&#xff1a;https://github.com/Avalon712/UniVue 开发版本仓库&…

196. 删除重复的电子邮箱

196. 删除重复的电子邮箱 题目链接&#xff1a;196. 删除重复的电子邮箱 代码如下&#xff1a; # Write your MySQL query statement below delete from Person as p where p.id not in(select e.id from (select min(id) as idfrom Person group by email ) as e )

(二十一)Java 之多态

目录 一. 前言 二. 多态 2.1. 实例入手 2.2. 虚方法 三. 多态的实现方式 四. 课后习题 一. 前言 多态是同一个行为具有多个不同表现形式或形态的能力。 多态性是对象多种表现形式的体现。 比如我们说“宠物”这个对象&#xff0c;它就有很多不同的表达或实现&#xff0c;…

web前端五行属性:深入探索与实战解析

web前端五行属性&#xff1a;深入探索与实战解析 在Web前端开发中&#xff0c;五行属性这一概念或许听起来有些陌生。然而&#xff0c;如果我们将其与前端开发的核心理念相结合&#xff0c;就能发现其中蕴含的深刻内涵。本文将从四个方面、五个方面、六个方面和七个方面&#…