桥接模式: 消息发送器设计

news2025/1/26 15:50:47

桥接模式是一种结构型设计模式,它将抽象部分与它的实现部分分离,使它们可以独立地变化。桥接模式通过将抽象和实现分离,可以让它们可以独立地变化,从而提高系统的灵活性和可扩展性。

在桥接模式中,有两个重要的概念:

  • 抽象部分(Abstraction):定义了抽象类,并维护一个指向实现部分的引用。抽象部分中的方法通常会委托给实现部分来处理。
  • 实现部分(Implementation):定义了实现类接口,供抽象部分调用。

通过桥接模式,我们可以在不修改抽象部分和实现部分的情况下,对它们进行独立的扩展和变化。这种模式特别适合用于需要支持多种平台或多种实现的情况。

一个消息发送器

让我们来看一个更简单的例子:一个消息发送器,可以通过不同的方式发送消息,比如通过电子邮件、短信或者推送通知。

我们将使用桥接模式来实现这个例子。首先,我们有一个消息发送器接口 MessageSender,它定义了发送消息的方法。然后,我们有不同的消息发送器实现类,比如 EmailSender、SMSSender 和 PushNotificationSender,它们分别实现了通过电子邮件、短信和推送通知发送消息的功能。最后,我们有一个消息类 Message,它包含消息内容和消息发送器,将消息内容通过消息发送器发送出去。

# 桥接模式的实现
# 实现部分
class MessageSender:
    def send_message(self, message):
        pass

# 具体实现部分
class EmailSender(MessageSender):
    def send_message(self, message):
        print(f"Sending email: {message}")

class SMSSender(MessageSender):
    def send_message(self, message):
        print(f"Sending SMS: {message}")

class PushNotificationSender(MessageSender):
    def send_message(self, message):
        print(f"Sending push notification: {message}")

# 抽象部分
class Message:
    def __init__(self, message, sender):
        self.message = message
        self.sender = sender

    def send(self):
        self.sender.send_message(self.message)

# 示例
if __name__ == "__main__":
    email_sender = EmailSender()
    sms_sender = SMSSender()
    push_notification_sender = PushNotificationSender()

    email_message = Message("Hello, this is an email message.", email_sender)
    sms_message = Message("Hello, this is an SMS message.", sms_sender)
    push_notification_message = Message("Hello, this is a push notification message.", push_notification_sender)

    email_message.send()
    sms_message.send()
    push_notification_message.send()

在这个例子中,我们定义了 MessageSender 消息发送器接口和三个具体的消息发送器类 EmailSender、SMSSender 和 PushNotificationSender。然后,我们定义了 Message 消息类,它包含消息内容和消息发送器,并实现了 send 方法来发送消息。

在示例中,我们创建了三种不同的消息实例,分别使用不同的消息发送器来发送消息。这个例子展示了桥接模式如何将消息类和消息发送器类解耦,使得它们可以独立变化。

查看原文:桥接模式

关注公众号 "字节航海家" 及时获取最新内容

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

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

相关文章

JavaBoy假期如何学习项目?弯道块才是真的快!

至暗时刻 老话说的好,弯道快才是真的快,谁直线不会加油?每到假期都是在座的各位弯道超车的时候。转眼自己已经出来搬了快四年砖头了,偶尔访问下牛客发现行情真是一年不如一年。。。不由得回想起自己春招时候的经历。 回想起2020年…

数据分析-Pandas数据的直方图探查

数据分析-Pandas数据的直方图探查 数据分析和处理中,难免会遇到各种数据,那么数据呈现怎样的规律呢?不管金融数据,风控数据,营销数据等等,莫不如此。如何通过图示展示数据的规律? 数据表&…

【贪心算法】Leetcode 455.分发饼干 376. 摆动序列 53. 最大子数组和

【贪心算法】Leetcode 455 分发饼干 376. 摆动序列【规律很多】53. 最大子数组和 455 分发饼干局部最优推全局最优:尽量用大饼干去满足大胃口的小朋友 376. 摆动序列【规律很多】思想:注意考虑一个坡度留首尾两个点、平坡、首尾 53. 最大子数组和【好思想…

FreeRTOS学习笔记-基于stm32(1)任务基础知识

一、裸机与RTOS 我们使用的32板子是裸机,又称前后台系统。裸机有如下缺点: 1、实时性差。只能一步一步执行任务,比如在一个while循环中,要想执行上一个任务,就必须把下面的任务执行完,循环一遍后才能执行…

从0开始学习NEON(2)

1、前言 继上一个例子,本次继续来学习NEON,本次学习NEON中向量拼接的操作,主要应用在图像的padding中。 https://blog.csdn.net/weixin_42108183/article/details/136440707 2、案例 2.1 案例1 在某些情况下,需要取在每个向量…

轻松压缩照片大小:简单实用的方法

当您需要通过网络传输或共享照片时,较小的文件大小可以提高传输速度并减少带宽消耗。这适用于通过电子邮件、社交媒体、即时消息应用程序等发送照片的场景。为了解决这个问题,本文将介绍一些简单而有效的方法来压缩照片的大小,以便更方便地分…

python并发编程:IO模型

一 IO模型 二 network IO 再说一下IO发生时涉及的对象和步骤。对于一个network IO \(这里我们以read举例\),它会涉及到两个系统对象,一个是调用这个IO的process \(or thread\),另一个就是系统内核\(kernel\)。当一个read操作发生时&#xff…

面试经典150题——基本计算器

​A husband is a man of many miles. ——Unknown 1. 题目描述 2. 题目分析与解析 2.1 思路一——先算括号内的内容 这个题目其实就是编译原理中很小的一个模块了,基本思路还是通过栈来实现。题目的难点主要在: 其中括号优先级的处理,以…

Spring揭秘:ImportBeanDefinitionRegistrar应用场景及实现原理!

内容概念 ImportBeanDefinitionRegistrar接口提供了强大的动态注册Bean的能力,它允许开发者在Spring容器初始化时,灵活地根据特定条件或需求来添加或修改Bean定义,从而实现更为精细的控制和扩展性。这是构建可扩展框架、插件系统或处理复杂配…

请说说你对Vue模板编译的理解

Vue模板编译是Vue.js框架的核心之一,它负责将Vue模板转换成渲染函数,从而实现模板的解析和渲染。要深入了解Vue模板编译,我们需要从编译过程、作用、特点等方面进行详细解析。 1. Vue模板编译的作用 Vue模板编译的主要作用是将Vue模板字符串…

021—pandas 书单整理将同一种书整理在一起

前言 在办公自动化场景下,最常见的需求就是信息的整理,pandas 最擅长复杂数据逻辑的处理,能够让整理工作更加高效,同时不容易出错。今天的案例是将一个平铺的书单按品类进行整理,合并为一行。 需求: 将书按书名进行合…

【python高级编程教程】笔记(python教程、python进阶)第三节:(1)多态与鸭子类型(Polymorphism and Duck Typing)

参考文章1:【比刷剧还爽】清华大佬耗时128小时讲完的Python高级教程!全套200集!学不会退出IT界! 参考文章2:清华教授大力打造的Python高级核心技术!整整100集,强烈建议学习(Python3…

基于springboot的母婴商城

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本母婴商城系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息&am…

Windows10安装Docker

使用 PowerShell 启用 Hyper-V 以管理员身份打开 PowerShell 控制台。 运行以下命令: PowerShell复制 Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All如果无法找到此命令,请确保你以管理员身份运行 PowerShell。 安装…

Claude3深夜震撼发布!模型特点分析,附使用教程

Claude3深夜震撼发布!模型特点分析,附使用教程 引言 最新发布的Claude3引起了广泛关注,这次发布一举推出了三个不同类型的模型,分别是Claude 3 Haiku、Claude 3 Sonnet和Claude 3 Opus。每个模型都具有独特的特点和能力&#xff…

Objective-C blocks 概要

1.block的使用 1.1什么是block? Blocks是C语言的扩充功能:带有自动变量(局部变量)的匿名函数。 “带有自动变量”在Blocks中表现为“截取自动变量" “匿名函数”就是“不带名称的函数” 块,封装了函数调用及调用…

代码随想录算法训练营Day38 || leetCode 7509. 斐波那契数 || 70. 爬楼梯 || 746. 使用最小花费爬楼梯

动态规划和我们数电中学习的时序电路类似,某一时刻的状态不仅与当前时刻的输入有关,还与之前的状态有关,所以推导过程中我们需要模拟题目中的情况,来找到每一时刻状态间的关系。 做题思路如下 509. 斐波那契数 此题简单 状态方程…

【QT】创建第一个QT程序

下面的前7个可以先不看,直接从8开始看 1. 创建Qt程序 一个Qt程序的组成部分:应用程序类,窗口类应用程序类个数:有且只有一个QApplication a;如何查看类对应的模块:光标移动到类上,F1qmake模块的名字 2. …

Java开发从零开始,mysql面试题索引

前言 “金九银十”的秋招热潮已经开始了,经过7月8月这两个月的提前批,终于成功拿下了一些大厂的offer。小编经过这么多次的面试,这两天整理了一份面试清单分享给大家,希望能给大家一点帮助(java方向),觉得有帮助的同学…

3分钟带你搞定电流采样电阻选型

大家好,我是砖一。 一,电流采样电阻的介绍 电流检测电路常用于高压短路保护、电机控制、DC/DC换流器、系统功耗管理、二次电池的电流管理、蓄电池管理等电流检测等场景。 比如,对于电机来说,电流检测电路是为了检测电流功能有比…