深入浅出设计模式 - 桥接模式

news2024/11/18 4:41:56

博主介绍: ✌博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家✌

Java知识图谱点击链接:体系化学习Java(Java面试专题)

💕💕 感兴趣的同学可以收藏关注下不然下次找不到哟💕💕

在这里插入图片描述

文章目录

  • 1、什么是桥接模式
  • 2、桥接模式的优缺点
  • 3、桥接模式的应用场景
  • 4、桥接模式的结构
  • 5、桥接模式的代码案例

1、什么是桥接模式

桥接模式(Bridge Pattern)是一种软件设计模式,它允许将一个大类或一组紧密相关的类拆分为抽象和实现两个独立的层次结构,从而能够在两个层次结构之间独立地进行变化。这种模式的主要目的是将抽象部分与实现部分分离,使它们可以独立地进行修改、扩展和重用。通过桥接模式,可以更加灵活地组合和扩展不同的抽象和实现,从而实现更高层次的抽象和更复杂的功能。

2、桥接模式的优缺点

桥接模式的优点包括:

  1. 分离抽象和实现,使得两者可以独立地变化,提高系统的灵活性和可扩展性。

  2. 可以减少子类的数量,简化系统的设计和实现。

  3. 可以更好地控制系统的复杂度,避免出现类爆炸的情况。

  4. 可以提高系统的可维护性和可测试性,降低维护和测试的成本。

桥接模式的缺点包括:

  1. 增加了系统的复杂度,需要额外的编码工作。

  2. 对系统的性能有一定的影响,因为需要通过抽象层和实现层之间的桥接来传递信息。

  3. 如果设计不合理,可能会导致系统的层次结构过于复杂,难以理解和维护。

3、桥接模式的应用场景

桥接模式主要适用于以下场景:

  1. 当一个类存在多个独立变化的维度时,可以使用桥接模式将这些维度分离出来,使得它们可以独立地变化,从而减少类的数量。

  2. 当需要在抽象和实现之间增加一个中间层时,可以使用桥接模式来实现。例如,当需要在不同平台上使用相同的代码时,可以将平台相关的代码放在实现层,将平台无关的代码放在抽象层,通过桥接来实现它们之间的通信。

  3. 当需要动态地切换抽象和实现的关系时,可以使用桥接模式来实现。例如,当需要在运行时切换不同的数据库时,可以将数据库相关的代码放在实现层,将业务逻辑相关的代码放在抽象层,通过桥接来实现它们之间的通信。

  4. 当需要对一个类进行扩展时,可以使用桥接模式来实现。例如,当需要对一个手机应用程序进行扩展,可以将应用程序的功能和界面分别放在抽象层和实现层,通过桥接来实现它们之间的通信,从而实现更加灵活的扩展。

4、桥接模式的结构

下面是桥接模式的结构:

  1. 抽象部分(Abstraction):定义抽象类,并包含一个指向实现部分的引用,它的主要职责是定义出高层次的抽象接口,实现部分的具体实现交给其实现部分处理。

  2. 扩展抽象部分(Refined Abstraction):扩展抽象部分的接口,通常需要根据具体业务需求进行扩展。

  3. 实现部分(Implementor):定义实现部分的接口,它不关心抽象部分的接口,只负责实现自己的业务逻辑。

  4. 具体实现部分(Concrete Implementor):具体实现实现部分的接口,通过实现接口来完成具体的业务逻辑。

桥接模式的结构中,抽象部分和实现部分是通过一个指向实现部分的引用进行关联的。这个引用可以在运行时进行动态绑定,从而实现不同的抽象和实现的组合。

5、桥接模式的代码案例

package com.pany.camp.design.principle.bridges;

/**
 *
 * @description:  接口
 * @copyright: @Copyright (c) 2022 
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0 
 * @createTime: 2023-06-27 20:19
 */
interface Color {
    void applyColor();
}

接口的实现

package com.pany.camp.design.principle.bridges;

/**
 *
 * @description:  红色
 * @copyright: @Copyright (c) 2022 
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0 
 * @createTime: 2023-06-27 20:20
 */
class RedColor implements Color {
    @Override
    public void applyColor() {
        System.out.println("Applying red color");
    }
}
package com.pany.camp.design.principle.bridges;

/**
 *
 * @description:  绿色
 * @copyright: @Copyright (c) 2022 
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0 
 * @createTime: 2023-06-27 20:20
 */
class GreenColor implements Color {
    @Override
    public void applyColor() {
        System.out.println("Applying green color");
    }
}

抽象类

package com.pany.camp.design.principle.bridges;

/**
 *
 * @description:  抽象类
 * @copyright: @Copyright (c) 2022
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0
 * @createTime: 2023-06-27 20:20
 */
public abstract class Shape {
    protected Color color;

    public Shape(Color color) {
        this.color = color;
    }

    abstract void draw();
}


扩展抽象类

package com.pany.camp.design.principle.bridges;

/**
 *
 * @description:  扩展抽象类
 * @copyright: @Copyright (c) 2022
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0
 * @createTime: 2023-06-27 20:21
 */
class Square extends Shape {
    public Square(Color color) {
        super(color);
    }

    @Override
    void draw() {
        System.out.print("Drawing a square, ");
        color.applyColor();
    }
}
package com.pany.camp.design.principle.bridges;

/**
 *
 * @description:  扩展抽象类
 * @copyright: @Copyright (c) 2022 
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0 
 * @createTime: 2023-06-27 20:21
 */
class Circle extends Shape {
    public Circle(Color color) {
        super(color);
    }

    @Override
    void draw() {
        System.out.print("Drawing a circle, ");
        color.applyColor();
    }
}

客户端程序:

package com.pany.camp.design.principle.bridges;

/**
 *
 * @description:  客户端
 * @copyright: @Copyright (c) 2022
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0
 * @createTime: 2023-06-27 20:22
 */
public class Client {

    public static void main(String[] args) {
        Color red = new RedColor();
        Color green = new GreenColor();

        Shape square = new Square(red);
        square.draw();

        Shape circle = new Circle(green);
        circle.draw();
    }

}

Color 是实现部分,Shape 是抽象部分,Square 和 Circle 是扩展抽象部分,RedColor 和 GreenColor 是具体实现部分。我们通过将颜色实现和形状抽象分离出来,可以实现不同形状和颜色的组合,从而提高系统的灵活性和可扩展性。

输出结果如下:

Drawing a square, Applying red color
Drawing a circle, Applying green color

Process finished with exit code 0

在这里插入图片描述

💕💕 本文由激流原创,首发于CSDN博客,博客主页 https://blog.csdn.net/qq_37967783?spm=1010.2135.3001.5421
💕💕喜欢的话记得点赞收藏啊

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

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

相关文章

68、基于51单片机语音识别控制小车行走系统设计(程序+原理图+PCB源文件+参考论文+开题报告+任务书+元器件清单等)

摘 要 随着电子工业的发展,具有语音控制功能的小车越来越受到人们的青睐,在人们的日常消费生活中起着不可忽视的作用。目前,声控技术已在很多领域得到使用。 本文对语音控制功能的小车概况做了阐述。在硬件设计方面,本论文以凌阳…

【Java高级语法】(二十)数学运算类:全面讲解Java数学计算的高级类库,BigDecimal、Math、Random、DecimalFormat...~

Java高级语法详解之数学运算类 1️⃣ 概念🔍 数学运算类汇总 2️⃣ 优势和缺点3️⃣ 使用3.1 各数学计算支持类使用案例3.2 Math类解析3.3 BigDecimal类解析3.4 Random类解析3.5 DecimalFormat类解析 4️⃣ 应用场景5️⃣ 使用技巧🌾 总结📑 …

ssm校园防疫管理系统-计算机毕设 附源码80315

ssm校园防疫管理系统 摘 要 2019年12月19号中国武汉发生第一例新冠病毒的到来,大家都在听从政府的号召在居家隔离,不管是在城市还是在乡镇、农村,这引起我的注目,设计一套大学ssm校园防疫管理系统,疫情防疫需要大家共同…

配置了git config --global credential.helper store后,还是弹出输入密码框

使用http协议拉取代码时,每次pull/push都会弹出账号密码框,可以使用git的配置credential.helper来保存每次输入的账号密码到硬盘上,命令git config --global credential.helper store,store表示存到硬盘中,但是按照这样操作后git pull还是弹出密码框,通过git config --list发现…

ESP32(MicroPython) WS2812 RGB流水灯 新版

ESP32(MicroPython) RGB流水灯 新版 本程序相比上一个程序,改用了24灯的环形WS2812模块,数据引脚改用13脚。增加了把相应颜色重复2次(即前半部分和后半部分的灯颜色排列相同)和4次的模式,模式增…

关于element-ui form表单必填项已经选入值并回填了,但是还会报错必填提示

哈喽 大家好啊 今天用el-form表单的时候 发现明明已经选入值并回填了 发现还是会触发必填报错 如图所示: 因为我这里是点击后右边是一个select选项帮助 然后点击确认后回填 经过发现,是因为rule表单触发校验规则 receiverName: [{ required: true, t…

HiveSQL之datediff、date_add、date_sub详解及注意坑点

文章目录 datediff介绍:示例1:正常情况示例2:负值情况注意:使用场景示例总结 date_add介绍: date_sub介绍: 注意: datediff 介绍: datediff语法: datediff(string enddate,string …

2023上半年Java高频面试题库总结(600+java面试真题含答案解析)

不知什么时候起,互联网行业掀起一股寒冬之风,到处都给人一种岌岌可危的寒颤之感,总觉得是要见不到明日的太阳一般,细细想来,最近的行业内的各种状况确实让不少人有此担忧。 从我认识的好几个程序员口中了解到&#xff…

8.0、Java_IO流 - 如何利用缓冲区提高读写效率 ?

8.0、Java_IO流 - 如何利用缓冲区提高读写效率 ? 简单介绍: FileInputStream 通过字节的方式读取文件,适合读取所有类型的文件(图像、视频、文本文件等);Java 也提供了 FileReader 字符流 专门读取文本文件…

linux系统之lvm方式挂载磁盘

目录 一、简介二、创建LVM三、删除 一、简介 LVM:逻辑卷管理(Logical Volume Manager) 它是Linux环境下对磁盘分区进行管理的一种机制。LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵活性。它由ibm公司提出。目的:在原始设…

简单认识Nginx配置块location及rewrite

文章目录 一、location配置块1、分类2、location 常用的匹配规则3、location 优先级:4.location 匹配流程5、location实际使用规则1、直接匹配网站根目录首页2、处理静态文件请求3、通用规则 二、rewrite配置块1、简介2、rewrite跳转实现3、rewrite 执行顺序4.rewri…

数据结构——归并排序和计数排序的介绍

文章目录 归并排序归并排序的思想单趟排序的实现归并排序实现非递归版本的实现特性总结 计数排序计数排序的思想计数排序的实现特性总结 归并排序 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治(Divide and…

【Java】Map和Set

目录 一、搜索树 1、概念 2、操作-查找 3、操作-插入 4、操作-删除(难点) 6、性能分析 二、搜索 1、概念及场景 2、模型 三、Map 的使用 1、关于Map的说明 2、关于Map.Entry的说明,> 3、Map 的常用方法说明 4、TreeMap的使用案例 四、…

Django之ORM

一、Django模型层之ORM介绍 使用Django框架开发web应用的过程中,不可避免地会涉及到数据的管理操作(增、删、改、查),而一旦谈到数据的管理操作,就需要用到数据库管理软件,例如mysql、oracle、Microsoft S…

护航行业安全!安全狗入选2023年度中国数字安全能力图谱(行业版)

近日,数世咨询正式发布了《2023年度中国数字安全能力图谱(行业版)》。 作为国内云原生安全领导厂商,安全狗也入选多个细项。 厦门服云信息科技有限公司(品牌名:安全狗)成立于2013年,…

8大service mesh框架大比拼,Istio不是唯一的选择!

文章目录 一、IsitoConsulLinkerdKumaOpen Service MeshMesheryTraefik MeshService Mesh Interface(SMI) 公众号: MCNU云原生,文章首发地,欢迎微信搜索关注,更多干货,第一时间掌握&#xff01…

Linux bluez蓝牙开发的准备工作

最近为了搞这个蓝牙的事情,忙碌了好几天,我就是想结合 bluez 的代码随便玩一下蓝牙设备,而且能够参考源码写点测试程序来操作这个蓝牙设备。这里只是说明 Linux 下的准备工作而非嵌入式的arm。 1,系统支持 我用的是真机安装的 D…

路由与交换技术(H3C)①——计算机网络基础

系列文章目录 ①——计算机网络基础 路由与交换技术(H3C)①——计算机网络概述 系列文章目录一 计算机网络概述1.1 计算机网络1.2 计算机网络的基本功能1.2.1 资源共享1.2.2 分布式处理与负载均衡1.2.3 综合信息服务 二 计算机网络的演进2.1 主机互联时…

Unity Editor扩展 实现一个Excel读表窗口

设计 Unity Editor窗口类 public class ExcelEditorWindow : EditorWindow {[MenuItem( "Frameworks/读表配置界面", false, 10 )]private static void Open(){Rect wr new Rect( 0, 0, 500, 500 );ExcelEditorWindow window ( ExcelEditorWindow ) EditorWindow.…

津津乐道设计模式 - 组合模式详解(以餐厅菜单系统举例让你快速掌握)

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…