结构设计模式 - 桥接设计模式 - 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.rhkb.cn/news/351665.html

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

相关文章

windows11 x64 23H2 企业纯净版2024.6.16

闲来无事试安装了下da_nao_yan的 【6月12日更新】Windows11 22631.3737企业版 23H2 自用优化版 (原版地址:https://bbs.pcbeta.com/viewthread-1985546-1-1.html),感觉比原版流畅多了,重新按照自己习惯封装了下&#x…

使用 C# 进行面向对象编程:第 9 部分

使用 OOP 的用户活动日志 应用程序背后的关键概念 在这一部分中,我们将使用之前学到的一些 OOP 概念。我们将创建一个小型应用程序。在继续之前,请阅读我的文章user-activity-log-using-C-Sharp-with-sql-server/。在本课程中,我们将再次使…

LabVIEW进行负载测试

本文介绍了如何使用LabVIEW进行负载测试,通过一个具体案例详细讲解了测试系统的组成、工作原理和实现方法。系统采用先进的硬件和软件架构,结合LabVIEW的强大功能,成功实现了对设备的高效负载测试,确保了系统的可靠性和性能。 项…

拥抱开源,构建未来:王嘉树与 TDengine 的开源之旅

在当代的技术浪潮中,开源文化不仅催生了无数创新技术,也为广大技术爱好者提供了一个展示才华、相互学习的平台。我们今天采访到的这位北京邮电大学电子工程学院的研究生,就是在这样的背景下,通过开源活动不断探索、学习并实现自我…

2024年汉字小达人活动还有4个多月开赛:来做18道历年选择题备考吧

结合最近几年的活动安排,预计2024年第11届汉字小达人比赛还有4个多月就启动,那么孩子们如何利用这段时间有条不紊地准备汉字小达人比赛呢? 我的建议是充分利用即将到来的暑假:①把小学1-5年级的语文课本上的知识点熟悉&#xff0…

Docker 安装 MySQL5.7 和 MySQL8

文章目录 安装 MySQL5.7拉取镜像前期准备启动容器 安装MySQL8.0拉取镜像查看镜像前期准备启动容器 安装 MySQL5.7 拉取镜像 docker pull mysql:5.7拉下来镜像后 执行 docker images 此时我们已经有这个镜像了。 前期准备 在根目录下创建 app , 在 app 目录下创建…

蚂蚁SEO的蜘蛛对网页收录有帮助吗 ?

网页蜘蛛对网站收录有着至关重要的帮助。在深入探讨这一话题之前,我们首先需要了解网页蜘蛛的工作原理及其在互联网生态系统中的角色。 网页蜘蛛,也被称为网络爬虫或网络机器人,是搜索引擎的核心组成部分。它们按照特定的算法和规则&#xff…

力扣231. 2 的幂(位运算)

Problem: 231. 2 的幂 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.若为0和负数则直接返回false; 2.利用一个标志数mask令其为一,不断的算术左移同时和n做与(&)运算,统计n中二进制位为1的个数&a…

Java | Leetcode Java题解之第155题最小栈

题目&#xff1a; 题解&#xff1a; class MinStack {Deque<Integer> xStack;Deque<Integer> minStack;public MinStack() {xStack new LinkedList<Integer>();minStack new LinkedList<Integer>();minStack.push(Integer.MAX_VALUE);}public void …

windows环境下配置git环境变量

路由当前目录 vim 打开 .bash_profile PATH$PATH:/d/phpstudy_pro/Extensions/php/php7.4.3nts PATH$PATH:/d/phpstudy_pro/Extensions/php8/php8.2.9nts PATH$PATH:/d/phpstudy_pro/Extensions/composer2.5.8 …

搭建一个简单的深度神经网络

目录 一、引入所需要的库 二、制作数据集 三、搭建神经网络 四、训练网络 五、测试网络 本博客实验环境为jupyter 一、引入所需要的库 torch库是核心&#xff0c;其中torch.nn 提供了搭建网络所需的所有组件&#xff0c;nn即神经网络。matplotlib类似与matlab&#xff0…

【react小项目】bmi-calculator

bmi-calculator 目录 bmi-calculator初始化项目01大致布局01代码 02完善样式02代码 03输入信息模块03代码 04 使用图表04代码 05详细记录信息渲染05代码 06 让数据变成响应式的06-1输入框的数据处理06-2图表&#xff0c;和记录信息的区域数据处理 07 删除功能&#xff0c;撤销功…

弗洛伊德算法——C语言

弗洛伊德算法&#xff0c;是一种用于解决所有顶点对之间最短路径问题的经典算法&#xff0c;该算法通过动态规划的方法计算出从每个顶点到其他所有顶点的最短路径。 弗洛伊德算法的基本思想是逐步考虑每一个顶点作为中间点&#xff0c;更新所有顶点对之间的最短路径。它通过以…

mySql的事务(操作一下)

目录 1. 简介2. 事务操作3. 四大特性4. 并发事务问题5. 脏读6. 不可重复读7. 幻读事务隔离级别参考链接 1. 简介 事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这些操作…

html是什么?http是什么?

html Html是什么&#xff1f;http是什么&#xff1f; Html 超文本标记语言&#xff1b;负责网页的架构&#xff1b; http(&#xff08;HyperText Transfer Protocol&#xff09;超文本传输协议&#xff1b; https&#xff08;全称&#xff1a;Hypertext Transfer Protocol …

VMware 桥接网络突然无法上网

VMware 桥接网络突然无法上网 0. 问题1. 解决方法 0. 问题 昨天&#xff0c;VMware 桥接网络正常使用&#xff0c;今天突然无法上网。 1. 解决方法 打开VMware的虚拟网络编辑器&#xff0c;将桥接模式的网络从“自动”改成你要使用的网卡&#xff0c;问题解决。 完成&#…

Numpy

文章目录 一、数据维度的概念1.1常见的多维数据1.2numpy的维度、形状、轴1.2.1维度1.2.2形状1.2.3轴 1.3reshape()函数1.4numpy中行、列向量的表示1.5数组的迭代1.6添加/删除元素1.6.1append()1.6.2insert()1.6.3delete() 二、Ndarray对象2.1简介2.1.1常用属性2.1.2.ndarray对象…

Python | Leetcode Python题解之第160题相交链表

题目&#xff1a; 题解&#xff1a; class Solution:def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:A, B headA, headBwhile A ! B:A A.next if A else headBB B.next if B else headAreturn A

Office办公软件如何下载安装?Office 2021最佳的办公软件安装包资源分享!

Office软件这种文档格式的普及&#xff0c;得益于其高度的兼容性和通用性&#xff0c;使得用户能够轻松地在不同的电脑和平台上打开和编辑文件。 Office软件文档格式的通用性&#xff0c;意味着无论是Windows、macOS还是Linux等操作系统&#xff0c;用户都能无障碍地打开和浏览…

【源码】16国语言交易所源码/币币交易+期权交易+秒合约交易+永续合约+交割合约+新币申购+投资理财/手机端uniapp纯源码+PC纯源码+后端PHP

测试环境&#xff1a;Linux系统CentOS7.6、宝塔面板、Nginx、PHP7.3、MySQL5.6&#xff0c;根目录public&#xff0c;伪静态laravel5&#xff0c;开启ssl证书 语言&#xff1a;16种&#xff0c;看图 这套带前端uniapp纯源码&#xff0c;手机端和pc端都有纯源码&#xff0c;后…