桥接模式

news2025/2/6 22:53:45

文章目录

    • 桥接模式
      • 1.桥接模式的本质
      • 2.何时选用桥接模式
      • 3.优缺点
      • 4.桥接模式的结构
      • 5.实现
        • 模拟消息发送
        • MVC在桥接模式的体现

桥接模式

桥接模式实质就是分离抽象和实现,抽象部分有多种,实现部分有多种,耦合在一起很难扩展,将其分离开来就很容易扩展,结构也清晰了

1.桥接模式的本质

桥接模式的本质:分离抽象和实现。

桥接模式最重要的工作就是分离抽象部分和实现部分,这是解决问题的关键。只有把抽象部分和实现部分分离开了,才能够让它们独立地变化;只有抽象部分和实现部分可以独立地变化,系统才会有更好的可扩展性和可维护性。

2.何时选用桥接模式

建议在以下情况中选用桥接模式。

  • 如果你不希望在抽象部分和实现部分采用固定的绑定关系,可以采用桥接模式,来把抽象部分和实现部分分开,然后在程序运行期间来动态地设置抽象部分需要用到的具体的实现,还可以动态地切换具体的实现。

  • 如果出现抽象部分和实现部分都能够扩展的情况,可以采用桥接模式,让抽象部分和实现部分独立地变化,从而灵活地进行单独扩展,而不是搅在一起,扩展一边就会影响到另一边。

  • 如果希望实现部分的修改不会对客户产生影响,可以采用桥接模式。由于客户是面向抽象的接口在运行,实现部分的修改可以独立于抽象部分,并不会对客户产生影响,也可以说对客户是透明的。

  • 如果采用继承的实现方案,会导致产生很多子类,对于这种情况,可以考虑采用桥接模式,分析功能变化的原因,看看是否能分离成不同的纬度,然后通过桥接模式来分离它们,从而减少子类的数目。

3.优缺点

桥接模式的优点

  • 分离抽象和实现部分
    桥接模式分离了抽象部分和实现部分,从而极大地提高了系统的灵活性。让抽象部分和实现部分独立开来,分别定义接口,这有助于对系统进行分层,从而产生更好的结构化的系统。对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了。

  • 更好的扩展性
    由于桥接模式把抽象部分和实现部分分离开了,而且分别定义接口,这就使得抽象部分和实现部分可以分别独立地扩展,而不会相互影响,从而大大地提高了系统的可扩展性。

  • 可动态地切换实现
    由于桥接模式把抽象部分和实现部分分离开了,所以在实现桥接的时候,就可以实现动态的选择和使用具体的实现。也就是说一个实现不再是固定的绑定在一个抽象接口上了,可以实现运行期间动态地切换。

  • 可减少子类的个数
    根据前面的讲述,对于有两个变化纬度的情况,如果采用继承的实现方式,大约需要两个纬度上的可变化数量的乘积个子类;而采用桥接模式来实现,大约需要两个纬度上的可变化数量的和个子类。可以明显地减少子类的个数。

4.桥接模式的结构

在这里插入图片描述

  • Abstraction:抽象部分的接口。通常在这个对象中,要维护一个实现部分的对象引用,抽象对象里面的方法,需要调用实现部分的对象来完成。这个对象中的方法,通常都是和具体的业务相关的方法。

  • RefinedAbstraction:扩展抽象部分的接口。通常在这些对象中,定义跟实际业务相关的方法,这些方法的实现通常会使用Abstraction中定义的方法,也可能需要调用实现部分的对象来完成。

  • Implementor:定义实现部分的接口。这个接口不用和 Abstraction中的方法一致,通常是由Implementor 接口提供基本的操作。而Abstraction中定义的是基于这些基本操作的业务方法,也就是说Abstraction定义了基于这些基本操作的较高层次的操作。

  • ConcreteImplementor:真正实现Implementor接口的对象。

5.实现

模拟消息发送

模拟发送消息,发送方式可以是短信发送、邮件发送,消息类型可以是普通消息、加急消息
有以下组合:

  • 短信-普通消息
  • 短信-加急消息
  • 邮件-普通消息
  • 邮件-加急消息

在这里插入图片描述

1.发送消息方式接口及其实现类

/**
 * @description:发送消息方式接口
 */
public interface Message {

    /**
     * 发送消息
     * @param message 消息内容
     * @param toUser 给谁发的消息
     */
    void send(String message,String toUser);
}

/**
 * @description:短信消息
 */
public class SMSMessage implements Message {


    @Override
    public void send(String message, String toUser) {
        System.out.println("发送短信消息,内容:" + message + ",发送给:" + toUser);
    }
}

/**
 * @description:邮件消息
 */
public class EmailMessage implements Message {


    @Override
    public void send(String message, String toUser) {
        System.out.println("发送邮件消息,内容:" + message + ",发送给:" + toUser);
    }
}

2.消息类型抽象类及其实现

/**
 * @description:消息类型
 */
@AllArgsConstructor
public abstract class AbstractMessage {

    protected Message messageImplementor;

    public void sendMessage(String message, String toUser) {
        messageImplementor.send(message,toUser);
    }
}

/**
 * @description:普通消息
 */
public class CommonMessage extends AbstractMessage {

    public CommonMessage(Message messageImplementor) {
        super(messageImplementor);
    }

    @Override
    public void sendMessage(String message, String toUser) {
        super.sendMessage(message, toUser);
    }
}

/**
 * @description:加急消息
 */
public class UrgentMessage extends AbstractMessage {

    public UrgentMessage(Message messageImplementor) {
        super(messageImplementor);
    }

    @Override
    public void sendMessage(String message, String toUser) {
        message = "加急:" + message;
        super.sendMessage(message, toUser);
    }
}

3.测试类

public class Client {

    public static void main(String[] args) {
        //短信消息
        Message sms=new SMSMessage();
        //邮件消息
        Message email=new EmailMessage();

        //短信普通消息
        new CommonMessage(sms).sendMessage("普通消息","张三");
        //邮件普通消息
        new CommonMessage(email).sendMessage("普通消息","张三");
        //短信加急消息
        new UrgentMessage(sms).sendMessage("加急消息","李四");
        //邮件加急消息
        new UrgentMessage(email).sendMessage("加急消息","李四");
    }
}

4.结果
在这里插入图片描述

如果想增加消息发送方式消息类型,只需要增加一个类实现对应接口或抽象类即可。

MVC在桥接模式的体现

其实MVC模式就是一种桥接模式,如下图
在这里插入图片描述

这样看不太明显,如果service有多个实现再看呢,Controller中的两个方法相当于两个实现类,可以调用serviceImpl1也可以调用serviceImpl2
在这里插入图片描述

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

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

相关文章

excel如何排序?两个方法汇总

排序是Excel中最常用的功能之一,也是数据分类和汇总操作的重要前提。excel如何排序?本文介绍如何给Excel里面的数据进行排序,方法很简单。感兴趣的朋友,赶紧来看看吧! 操作环境: 演示机型:Dell …

PostgreSQL 导入 SLS,从业务到监控数据

日志服务SLS数据导入简介 日志服务SLS是云原生观测和分析平台,为Log、Metric、Trace等数据提供大规模、低成本、实时的平台化服务。日志服务是提供一站式数据采集、加工、查询与分析、可视化、告警、消费与投递等功能。全面提升在研发、运维、运营、安全等场景的数…

web常见的攻击方式有哪些,以及如何进行防御?

一、是什么 Web攻击(WebAttack)是针对用户上网行为或网站服务器等设备进行攻击的行为 如植入恶意代码,修改网站权限,获取网站用户隐私信息等等 Web应用程序的安全性是任何基于Web业务的重要组成部分 确保Web应用程序安全十分重…

python中的模块与包详解

目录 一.什么是模块 二.模块的导入 1.import 模块名 2.from 模块名 import 功能名 3.from 模块名 import * 4.as定义别名 模块导入总结 三.自定义模块 制作自定义模块 用pycharm演示 测试模块_ _main_ _变量的作用 演示 ‘_ _all_ _’变量 自定义模块小结 四.python中的包…

Flink集成Seatunnel

安装包下载 相关包的下载地址 Apache SeaTunnel | Apache SeaTunnel Apache Flink: Downloads 解压(注意下载scala_2.11) tar -zxvf flink-1.13.6-bin-scala_2.11.tgz -C ../module/ Yarn模式部署 环境准备 sudo vi /etc/profile.d/my_env.sh 修…

中国清洁清洗行业等级资质

中国商业企业管理协会清洁服务商专业委员会——“中清委”(以下简称评定单位)承担组织等级清洁清洗服务机构评定工作。 申请资料 (1)专业清洁清洗服务机构等级评定申请表(附录B); (2)法人代表资格证明&#xff1…

小林Coding阅读笔记:操作系统篇之硬件结构,伪共享问题及CPU的任务执行

前言 参考/导流: 小林coding - 2.5 CPU 是如何执行任务的?学习意义 底层基础知识,了解CPU执行过程,让上层编码有效并发问题处理、思考理解调度策略、思想借鉴分析 相关说明 该篇博文是个人阅读的重要梳理,仅做简单参…

Transformer实现以及Pytorch源码解读(一)-数据输入篇

目标 以词性标注任务为例子,实现Transformer,并分析实现Pytorch的源码解读。 数据准备 所选的数据为nltk数据工具中的treebank数据集。treebank数据集的样子如以下两幅图所示: 该数据集中解释变量为若干句完整的句子: 被解释变…

Docker-DockerFile制定镜像

什么是DockerFile? DockerFile是一个用来编写Docker镜像的文本文件,文本内容包含了一条条构建镜像所需要的指令和说明。DockerFile就想要一个脚本文件一样。把我们想要执行的操作放到文本文件里,一键执行。这样我们就可以复用这个DockerFile…

读论文:Learning to Compare: Relation Network for Few-Shot Learning

Abstract 我们提出了一个概念上简单、灵活且通用的少镜头学习框架,其中分类器必须学习识别每个只给出少量示例的新类。我们的方法称为关系网络(RN),从头到尾进行训练。在元学习过程中,它学习学习一个深度距离度量来比较插曲中的少量图像&…

RNA-seq 详细教程:时间点分析(14)

学习内容 了解如何使用 DESeq2 进行时间的分析LRT 使用 LRT 进行 Time course 分析尽管基因表达的静态测量很受欢迎,但生物过程的时程捕获对于反映其动态性质至关重要,特别是当模式复杂且不仅仅是上升或下降时。在处理此类数据时,似然比检验 …

doris入门后遇到的几个问题总结

文章目录1. Access denied for user anonymnull (using password: NO)2. timeout when waiting for send fragments RPC. Wait(sec): 5, host: xxx(ip)3. Failed to initialize JNI: Failed to find the library libjvm.so.4. 从mysql库导出的json文件大于100M时报错5. csv格式…

OA办公系统:颠覆企业办公模式,激活组织潜能打造新模式

企业的生命力在于生存,而想要在竞争日益激烈的市场环境下生存,就必须不断革新自己的内部条件,否则将会在发展的洪流中被社会所淘汰。如今社会的发展正在信息化世界中进行,企业搭建信息化平台是一条必经之道,而OA办公自…

太爽了!看酷开系统帮你沉浸式带娃!

现如今,OTT大屏涉及的线上内容与娱乐方式与日俱增,不仅常规的电视节目、网剧影视能够随心选择,还发展出以大屏为载体的短视频、健身、云游戏等丰富内容。在人们的居家生活走向常态化的当下,更长的开机使用时间自然对电视操作系统的…

codeforces:C. Another Array Problem【分类讨论 + 找规律】

目录题目截图题目分析ac code总结题目截图 题目分析 做cf题目别老想着套算法模版 找规律才是正道,这就是所谓的「思维」 n 2很简单 n > 4: # 肯定有一个最大值,不妨设它的位置在第三个或以后的x# 前两个值经过两次操作,都变为0# 第0…

Vue.js 目录结构

当我们初始化一个项目后目录结构是这样的: 目录解析 目录/文件说明build项目构建(webpack)相关代码config配置目录,包括端口号等。我们初学可以使用默认的。node_modulesnpm 加载的项目依赖模块src这里是我们要开发的目录,基本上要做的事情都…

# 关于“table“中更新传参回填form

关于"table"中更新传参回填form 一、id查询数据库回填form 使用阶段:Javaweb/ssm/Springboot出现场景:jsp页面(el表达式)、thymeleaf页面(thymeleaf表达式,具体使用方法请前往百度)…

Python成求职中最吃香的三大编程语言之一

程序员培训公司 CodinGame 发布的一份开发人员调查报告显示,在开发人员招聘中,拥有 JavaScript、Java 和 Python 三大编程语言技能的开发人员最受招聘经理欢迎。 该报告基于对全球近 15,000 名开发人员和人力资源专业人员的调查。报告显示,每…

【IO流】JAVA基础篇(一)

文章目录一、字节流和字符流的区别1、字节和字符换算关系2、字节、位、二进制之间的关系3、在64位的操作系统中,一个字等于多少字节?4、字节流和字符流区别二、InputStream1、FileInputStream2、FilterInputStream3、ObjectInputStream4、PipedInputStre…

玩客云刷ARMBIAN当服务器过程记录

玩客云的可玩性 1、可以刷成电视游戏盒子的双系统。也可以刷成单独的电视盒子和游戏盒子。不过因为内存有限放不了多少游戏。还是建议用外置SD卡存储游戏比较合适。 2、刷成Armbian linux系统(可以实现docker、可道云、甜糖等多种功能) 3、最后它还可…