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

news2024/11/25 7:04:13

桥接设计模式

    • 一. 介绍
    • 二. 桥接模式示例
      • 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{
    @Override
    public void applyColor() {
        System.out.println("黑色");
    }
}

WhiteColor类

/**
 * @author chenyunzhi
 * @date 2024/5/31 16:59
 * @Description 白色
 */
public class WhiteColor  implements Color{
    @Override
    public 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);
    }

    @Override
    void 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);
    }

    @Override
    void 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.coloradmin.cn/o/1830103.html

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

相关文章

串口触摸屏分割字符串

分割字符串的方法1、split2、indexOf()3、substr(start,length) 分割字符串的方法 1、split:将一个字符串分割为子字符串,然后将结果作为字符串数组返回。 2、indexOf() :返回某个指定的字符串值在字符串中首次出现的位置(从左向右…

Vue55-TodoList案例-本地存储

一、TodoList案例-本地存储 此时,修改对象里面的属性,watch监视不到! 需要深度监视,就不能用简写形式! 二、jeecg-boot中的本地存储 jeecg-boot中,浏览器的本地存储,存储的是token!…

Vue56-组件的自定义事件

一、什么是自定义事件 二、子组件—【传值】—>父组件 2-1、prop属性 2-2、自定义事件 v-on在谁身上,就给谁绑定事件! 给谁绑定的事件,想触发就找谁! 2-3、prop属性VS自定义属性 2-4、简写形式 2-5、ref属性实现 加了ref属性…

Matlab自学笔记三十一:结构数组的创建、索引和预分配内存

1.概念 结构(structure array)是一种具有容器特性的数据类型,它使用称为字段的数据容器对相关数据进行分组,每个字段可以包含任何类型或大小的数据,所有元素都具有相同数量的字段和相同的字段名称。(与元胞…

【安装笔记-20240616-Windows-Gpg4win 证书管理器】

安装笔记-系列文章目录 安装笔记-20240616-Windows-Gpg4win 证书管理器 文章目录 安装笔记-系列文章目录安装笔记-20240616-Windows-Gpg4win 证书管理器 前言一、软件介绍名称:Gpg4win主页官方介绍 二、安装步骤测试版本:Gpg4win 4.3.1下载链接安装界面…

深入了解RSA加密算法

目录 前言 一、什么是RSA? 二、RSA加密的基本概念 1.非对称加密 2.密钥生成 3.加密和解密 三、RSA加密的工作原理 四、RSA的应用场景 五、RSA加密解密的实现 六、RSA算法的局限性及改进措施 前言 在当今的数字化时代,信息的安全性成为了人们关注…

课设--学生成绩管理系统(三)

欢迎来到 Papicatch的博客 文章目录 🍉报告目的 🍉总体设计 🍈 模块处理逻辑 🍉数据库设计 🍈总览表 🍈表设计 🍍管理员信息表 🍍课程基本信息表 🍍课程扩展信息…

浙大版PTA Python程序设计 题目与知识点整理(综合版)

目录 第一章 一、高级语言程序的执行方式 二、变量赋值与内存地址 三、字符编码 3.1 Unicode 3.2 ASCII(American Standard Code for Information Interchange) 四、编程语言分类按照编程范式分类 4.1 面向过程语言 4.2 面向对象语言 五、原码…

LabVIEW电子类实验虚拟仿真系统

开发了基于LabVIEW开发的电子类实验虚拟仿真实验系统。该系统通过图形化编程方式,实现了复杂电子实验操作的虚拟化,不仅提高了学生的操作熟练度和学习兴趣,而且通过智能评价模块提供即时反馈,促进教学和学习的互动。 项目背景 在…

飞书API 2-1:如何通过 API 创建文件夹?

本文探讨如何通过飞书的 API 来创建文件夹。通过 API 创建的文件夹,一般是放在共享空间,如果要放在个人空间,建议手动创建。 查看 API 文档 API 路径,可在飞书开放平台的服务端 API,依次查找云文档>云空间>文件…

多种方案图文并茂分分钟教你解决Kubernetes(k8s)容器安全问题(不断更新中)

文章目录 Kubernetes(k8s)Secrets in clear text environment variables 明文中的秘密环境变量问题详解 解决方案一STEP1: 创建Kubernetes Secret - 编写一个yaml文件STEP2: 部署执行上述yamlSTEP3: 将Secret作为卷挂载到Pod中-在项目部署K8S.yaml中挂载…

【Perl】与【Excel】

引言 perl脚本语言对于文本的处理、转换很强大。对于一些信息量庞大的文本文件,看起来不直观,可以将信息提取至excel表格中,增加数据分析的可视化。perl语言的cpan提供了大量模块。对于excel文件的操作主要用到模块: Spreadshee…

1970python高校教室管理系统mysql数据库Django框架bootstrap布局计算机软件工程网页

一、源码特点 python Django 高校教室管理系统是一套完善的web设计系统mysql数据库 ,对理解python编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 python Django 高校教室管理系统 开发环境pycharm mys…

2.华为配置静态路由

通过配置静态路由让PC1和PC2互通 AR1 [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 192.168.1.254 24 [Huawei]int g0/0/1 [Huawei-GigabitEthernet0/0/1]ip add 1.1.1.1 24 [Huawei]ip route-static 192.168.2.0 24 1.1.1.2AR2 [Huawei]int g0/0/0 [Huawei-Gig…

ARM Linux 设备树详细介绍(2)共二篇

承接上文,第一篇 3. Device&Tree 引发的 BSP 和驱动变更 有了 Device Tree 后,大量的板级信息都不再需要,譬如过去经常在 arch/arm/plat-xxx 和 arch/arm/mach-xxx 实施的如下事情: 1. 注册 platform_device,绑定 …

《人生海海》读后感

麦家是写谍战的高手,《暗算》《风声》等等作品被搬上荧屏后,掀起了一阵一阵的收视狂潮。麦家声名远扬我自然是知道的,然而我对谍战似乎总是提不起兴趣,因此从来没有拜读过他的作品。这几天无聊时在网上找找看看,发现了…

从xxl-job源码中学习Netty的使用

1. 启动与Spring实例化 com.xxl.job.core.executor.impl.XxlJobSpringExecutor.java类 继承SmartInitializingSingleton 类,在afterSingletonsInstantiated 实例化后方法中 调用initJobHandlerMethodRepository 把所有的xxljob任务管理起来; private…

ARM Linux 设备树详细介绍(1)

1. ARM&Device&Tree 起源 Linus Torvalds 在 2011 年 3 月 17 日的 ARM Linux 邮件列表宣称“this whole ARM thing is a f*cking pain in the ass”,引发 ARM Linux 社区的地震,随后 ARM 社区进行了一系列 的重大修正。 在过去的 ARM Linux 中&…

电子电气架构 --- 智能座舱功能应用

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

springCloudAlibaba之分布式网关组件---gateway

gateway-网关 网关spring cloud gatewaygateway初体验gateway整合nacos简写方式 网关 在微服务架构中一个系统会被拆分成多个微服务。那么作为客户端(前端)要如何去调用这么多的微服务?如果没有网关的存在,我们只能在客户端记录每个微服务的地址&#xf…