【设计模式】桥接模式(Bridge Pattern)

news2024/11/16 13:26:20

桥接模式属于结构型模式,主要解决因业务增长时滥用继承而导致的**“类爆炸”问题。桥接模式将一个树型的整体继承结构替换为由抽象的类(抽象化角色)组成的抽象部分和由实现接口(实现化角色)与实现类(具体实现化角色)组成的实现部分**,再让较为抽象的类中持有实现接口的实例,以此作为桥梁来完成两个部分的通信。此时,通过将继承关系替换成关联关系实现了抽象类部分与实现类部分的分离与解耦,使得二者可以独立变化。

文章目录

  • 桥接模式的介绍
    • 优点
    • 缺点
    • 应用场景
    • 类爆炸
  • 桥接模式的使用
    • 类图
    • 实现方法
      • 第一步,编写实现接口
      • 第二步,编写实现类
      • 第三步,编写抽象部分的类
      • 第四步,编写测试类测试


桥接模式的介绍

​ 桥接模式通过将抽象部分与实现部分抽离,使二者的关系有继承转变为聚合关联关系,以此来减少耦合性,让二者能够独立变化与扩展。

​ 这里的抽象实现并不特指abstractimplements,更多是现实生活中所认知的事物。例如:相对一部折叠式的华为手机来说,手机这个类就显得抽象得多,所以可以把手机看做抽象部分,折叠式华为手机看做实现部分。

​ 使用桥接模式可以让抽象和实现不再在同一个继承层次结构中,而是按照事物的多维度变化分成多个部分,而每个部分也需要“子类化”,不论抽象部分还是实现部分,都应当具有自己的子类,以便各个部分的子类随意组合,从而获得多维度的组合对象。

优点

  • 解除了抽象与实现部分绑定关系,使得二者可以按照不同的维度扩展变化
  • 具有优秀的扩展能力
  • 符合开闭原则

缺点

  • 需要开发者正确识别出系统中两个独立变化的维度,这增加系统的设计和理解难度

应用场景

  • 消息系统中,从业务类型维度看存在普通消息、延时消息、加急消息等,从发送方式维度看有邮件发送、短息发送、公众号消息发送、站内消息发送等,此时就可以使用桥接模式进行分离。

类爆炸

​ 一个事物通常有多个维度,例如,图形从形状上可分为圆形、方形等形状,从颜色角度看有红色、蓝色等。如要把图形按继承的方法抽象成类,那么圆形、方形继承与图形,而圆形又有红色的圆、蓝色的圆等多个子类。

image-20221123163144895

此时我要增加一个三角形,那同时也得增加红色三角形和蓝色三角形,假如我还想再增加一个绿颜色,那么所有图形都得再增加一个绿色的子类。之后当图形和颜色越加越多时,那这个结构中的类就会成指数的增长,导致**“类爆炸”**。

image-20221123165726792



桥接模式的使用

​ 以上面的图形例子来讲,我找到了两个变化的维度,一个是图形会增加,一个是颜色会增加。那么按照桥接模式,可以将颜色这个实现部分抽离出来,实现一个颜色接口,并在图形类中加入一个颜色的实例,以此完成颜色与图形的搭桥连接。

类图

image-20221123183647886

  • 抽象化(Abstraction)角色:定义抽象类,作为抽象与实现的桥梁,维护一个实现化对象的引用。
  • 扩展抽象化(RefinedAbstraction)角色:是抽象类的子类,实现父类中的抽象方法,通过父类维护的实现化对象来调用实现类中的业务方法。
  • 实现化(Implementor)角色:这个角色给出实现化角色的接口,但不给出具体的实现。必须指出的是,这个接口不一定和抽象化角色的接口定义相同,实际上,这两个接口可以非常不一样。实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作。
  • 具体实现化(ConcreteImplementor)角色:实现化角色接口的具体实现。


实现方法


第一步,编写实现接口

图形颜色

package 设计模式.结构型模式.桥接模式;

/**
 * 实现化角色,每个实现类都通过该接口与抽象化相连接
 */
public interface 图形颜色 {
    String 上色();
}

第二步,编写实现类

红色

package 设计模式.结构型模式.桥接模式;

/**
 * 具体实现类
 */
public class 红色 implements 图形颜色 {
    @Override
    public String 上色() {
        return "红色";
    }
}

蓝色

package 设计模式.结构型模式.桥接模式;

/**
 * 具体实现类
 */
public class 蓝色 implements 图形颜色 {
    @Override
    public String 上色() {
        return "蓝色";
    }
}


第三步,编写抽象部分的类

图形

package 设计模式.结构型模式.桥接模式;

/**
 * 抽象化角色
 */
public abstract class 图形 {
    // 维护一个实现化的对象
    protected 图形颜色 颜色;

    protected 图形(图形颜色 颜色){
        // 通过构造方法注入实现类过程就是桥接的过程
        this.颜色 = 颜色;
    }

    public abstract void 绘制();
}

圆形

package 设计模式.结构型模式.桥接模式;

public class 圆形 extends 图形 {

    // 通过构造方法传递具体的实现类对象,由抽象类保存维护
    protected 圆形(图形颜色 颜色) {
        super(颜色);
    }

    @Override
    public void 绘制() {
        // 在此方法中调用实现类,进行多维组合
        System.out.println("绘制一个圆形,并开始上色:"+颜色.上色());
    }
}

方形

package 设计模式.结构型模式.桥接模式;

public class 方形 extends 图形 {
    // 通过构造方法传递具体的实现类对象,由抽象类保存维护
    protected 方形(图形颜色 颜色) {
        super(颜色);
    }

    @Override
    public void 绘制() {
        // 在此方法中调用实现类,进行多维组合
        System.out.println("绘制一个正方形,并且开始上色:"+颜色.上色());
    }
}

第四步,编写测试类测试

测试类

package 设计模式.结构型模式.桥接模式;

public class 测试类 {
    public static void main(String[] args) {
        圆形 红色圆形 = new 圆形(new 红色());
        红色圆形.绘制();
        方形 蓝色方形 = new 方形(new 蓝色());
        蓝色方形.绘制();
        圆形 蓝色圆形 = new 圆形(new 蓝色());
        蓝色圆形.绘制();
        方形 红色方形 = new 方形(new 红色());
        红色方形.绘制();
    }
}

测试结果

image-20221123190551553

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

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

相关文章

无法访问mybatis.dto.StudengInVO-使用maven编译报错

一、问题由来 最近一次拉代码后,合并代码然后进行编译时出现一个问题,使用maven在进行编译的时候报一个错,无法访问mybatis.dto.StudengInVO。 突然出现这个错误让自己感觉很奇怪,开发工具已经使用了好几个月,项目也已…

SSM毕设项目 - 基于SSM的汉服文化平台网站(含源码+论文)

文章目录1 项目简介2 实现效果2.1 界面展示3 设计方案3.1 概述3.2 系统流程3.3 系统结构设计4 项目获取1 项目简介 Hi,各位同学好呀,这里是M学姐! 今天向大家分享一个今年(2022)最新完成的毕业设计项目作品,【基于SSM的汉服文化…

(十三)Spring之JdbcTemplate

文章目录环境新增、删除与修改数据新增修改删除查询一个查询一个对象查询一个值查询多个对象批量操作批量添加批量修改批量删除使用回调函数使用德鲁伊连接池上一篇:(十二)Spring IoC注解式开发JdbcTemplate是Spring提供的一个JDBC模板类&…

高阶数据结构:二叉搜索树

本篇主要是在初级数据结构中介绍的二叉树的提升,了解二叉搜索树的特性。 文章目录 一、二叉搜索树的概念二、二叉搜索树操作 1、二叉搜索树的查找2、二叉搜索树的插入3、二叉搜索树的删除三、二叉搜索树的实现四、二叉搜索树的应用五、关于二叉树进阶面试题一、二叉…

大衣哥又有喜事了,孟文豪新作《克什克腾的眼泪》,是给他写的吗

农民歌唱家大衣哥又出新歌啦! 就在大衣哥被谷传民起诉不久,互联网上面又传出新消息,继《火火的情怀》之后,大衣哥的新歌《新时代的新农民》,又要和大家见面了。很多人不明白,大衣哥不过是一个农民歌唱家&am…

Java中的反射,枚举和Lambda表达式

一. 反射 1. 反射的概述 2. 反射的使用 反射常用的类 通过反射获取Class对象 获得Class类相关的方法 使用反射创建实例对象 使用反射获取实例对象中的构造方法 通过反射获取实例对象的属性 通过反射获取实例对象的方法 3. 反射的优缺点 二. 枚举 1…

Graalvm 安装和静态编译

文章目录1、下载2、graalvm安装3、native-image工具安装3.1 安装native-image3.2 安装C编译工具4、java编译成二进制exe4.1、普通的java命令行应用4.2、Swing应用编译4.3、使用maven插件静态编译4.4、javafx应用编译1、下载 文件下载:https://www.graalvm.org/down…

[附源码]计算机毕业设计JAVA剧本杀门店管理系统-

[附源码]计算机毕业设计JAVA剧本杀门店管理系统- 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM myb…

OBS-VirtualCam OBS的虚拟摄像头插件

OBS-VirtualCam 是OBS的一个虚拟摄像头插件,可以将OBS中的内容提供给一个虚拟摄像头,这样其它软件就可以使用这个内容了,这里试试这个插件功能。 1. 下载obs并安装 登录OBS Studio网站,下载windows版, 下载完成后并安装…

栈的基本操作

目录 一、什么是栈? 二、用单链表实现栈 三、用顺序表数组实现栈 一、什么是栈? 栈(stack)是一个先进后出(FILO-First In Last Out)的有序列表。 主要方法:入栈(push)…

SCA算法优化脉冲耦合神经网络的图像自动分割(Matlab代码实现)

🍒🍒🍒欢迎关注🌈🌈🌈 📝个人主页:我爱Matlab 👍点赞➕评论➕收藏 养成习惯(一键三连)🌻🌻🌻 🍌希…

【C语言】初识指针(终篇)

摸了一手秀发,发现还在~ 目录 1、指针运算 1.1指针加减整数 1.2指针减指针 1.3指针关系运算 2、二级指针 3、指针和数组 4、指针数组 前言: 大家好,我是拳击哥。上一期我们讲到了指针类型,指针的访问步长,野指针…

Redis数据类型总结

文章目录一、5种数据类型二、常用指令汇总三、应用汇总提示:以下是本篇文章正文内容,Redis系列学习将会持续更新 一、5种数据类型 Redis 数据存储格式:  ● redis 自身是一个 Map ,其中所有的数据都是采用 key : value 的形式存储。  ● 数…

如何设计用户体验测试用例

一、 什么是用户体验 UE: User Experience 用户体验。 用户体验是指用户在使用产品过程中的个人主观感受,即用户在使用一个产品之前、使用过程中、使用后的整体感受,包括行为、情感、喜好、生理和心里反应、成就等各个方面。 通俗的讲用户体…

希望所有计算机学生都知道这些宝藏网站

GitHub GitHub是一个面向开源及私有软件项目的托管平台,因为只支持Git作为唯一的版本库格式进行托管,故名GitHub。 作为开源代码库以及版本控制系统,Github拥有超过900万开发者用户。随着越来越多的应用程序转移到了云上,Github已…

数据结构与算法(五) 动态规划

这篇文章来讲动态规划(Dynamic Programming),这是一个在面试中很经常出现的题型 1、本质 之前说过,解决算法问题的主流思路就是穷举搜索,即遍历整个搜索空间,找到给定问题的解 只是在某些场景下&#xff…

Python学习 - 异常处理

Python学习 - 语法入门:https://blog.csdn.net/wanzijy/article/details/125287855 Python学习 - 数据类型:https://blog.csdn.net/wanzijy/article/details/125341568 Python学习 - 流程控制:https://blog.csdn.net/wanzijy/article/details…

3dmax网渲云渲染哪个平台费用低?一张图要多少钱多长时间?怎么收费

话说现在的设计师应该没有不知道云渲染的吧?毕竟比起本地渲,云渲染不占本地资源,一次能渲很多张,方便又快捷,有谁不喜欢呢!那么这么多的云渲染平台用哪个呢?今天我们就以主流的4个平台为例&…

(STM32)从零开始的RT-Thread之旅--SPI驱动ST7735(4)使用LVGL

上一篇: (STM32)从零开始的RT-Thread之旅--SPI驱动ST7735(3)使用DMA 经过前几章的搭建,底层显示已经没有问题了,现在需要添加上层的库,我选择了比较火的开源GUI库--LVGL。而RT-Thread Studio支持直接添加LVGL代码库的。 在RT-T…

人工智能-4计算机视觉和图像处理01

深度学习简介 机器学习是实现人工智能的一种途径,深度学习是机器学习的一个子集 深度学习相比于机器学习,少了‘手动特征提取’部分,交给网络来处理 深度学习流程:数据输入–训练模型(在数据中学习)–输出预…