Python设计模式 - 桥接模式

定义

桥接模式是一种结构型设计模式,它的核心思想是将抽象部分与实现部分分离,使它们可以独立变化。

结构

在这里插入图片描述

  • 抽象类(Abstraction):定义抽象接口,持有实现部分的引用。
  • 具体抽象类(Refined Abstraction):扩展抽象接口。
  • 实现类(Implementor):定义实现部分的接口,通常是一些基础操作。
  • 具体实现类(Concrete Implementor):提供实现类接口的具体实现。

通常,抽象部分是面向高层业务逻辑的,而实现部分则关注底层细节。因此一般会将与业务方法关系更密切的维度设计为抽象部分。

应用场景

  1. 跨平台 GUI 组件:当 GUI 组件需要在多个操作系统上运行且渲染方式不同时,使用桥接模式解耦 UI 组件与平台渲染逻辑。
  2. 图形绘制引擎:当应用程序需要支持不同的图形绘制库(如 OpenGL、DirectX),使用桥接模式解耦图形形状与具体的绘制引擎。

优缺点

优点:

  1. 解耦抽象与实现,提高代码灵活性:使抽象部分和实现部分可以独立扩展,避免二者强耦合,提高系统的灵活性。
  2. 扩展性强,符合开闭原则:新增抽象部分或实现部分时,无需修改现有代码,只需添加新的具体抽象类或具体实现类即可,提高了系统的可扩展性,并且符合开闭原则。
  3. 减少子类数量:通过动态组合代替继承,降低类的数量,减少复杂度,提升可维护性。

缺点:

  1. 对客户端不够友好:客户端需要理解抽象部分与实现部分的组合方式,相比直接使用继承,增加了使用和理解的复杂度。

代码示例

from abc import ABC, abstractmethod# 实现部分:消息发送方式(短信、邮件)
class MessageSender(ABC):@abstractmethoddef send(self, message: str):passclass SMSMessageSender(MessageSender):def send(self, message: str):print(f"【短信发送】{message}")class EmailMessageSender(MessageSender):def send(self, message: str):print(f"【邮件发送】{message}")# 抽象部分:消息类型(普通消息、加急消息)
class Message(ABC):def __init__(self, sender: MessageSender):self.sender = sender  # 通过组合方式使用消息发送方式@abstractmethoddef send(self, content: str):passclass CommonMessage(Message):def send(self, content: str):print("【普通消息】处理中...")self.sender.send(content)class UrgentMessage(Message):def send(self, content: str):print("【加急消息】需要立即处理!")self.sender.send(f"【加急】{content}")# 客户端代码
if __name__ == "__main__":# 选择短信方式发送普通消息sms_sender = SMSMessageSender()common_msg = CommonMessage(sms_sender)common_msg.send("会议将在下午3点举行")# 选择邮件方式发送加急消息email_sender = EmailMessageSender()urgent_msg = UrgentMessage(email_sender)urgent_msg.send("服务器异常,请立即检查!")

参考

《设计模式的艺术》

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

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

相关文章

【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 用户注册实现

大家好,我是java1234_小锋老师,最近写了一套【NLP舆情分析】基于python微博舆情分析可视化系统(flaskpandasecharts)视频教程,持续更新中,计划月底更新完,感谢支持。今天讲解用户注册实现 视频在线地址: …

华为7月23日机考真题

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 笔试突围OJ](bishipass.com) 03. 山峰观测站数据分析 问题描述 LYA是一名地理数据分析师,负责分析山峰观测站收集的海拔高度数据。观测站在一条直线上设置了…

图像分析学习笔记(4):机器学习图像特征与描述

图像分析学习笔记(4):机器学习图像特征与描述深度学习基础深度学习技巧深度模型构建深度学习基础 深度学习概念:深度学习是机器学习的一个分支,它基于一系列算法,试图通过使用多个处理层建立数据的高级抽象…

锁付机器人,如何精准锁附革新新能源锂电装配效率

其实呢,随着科技的不断发展,新能源电池、智能制造、精密装配、工艺升级以及工业自动化这些领域都在飞速前进。新能源行业如今可是炙手可热,中国新能源行业进入快速发展阶段,就像一列高速行驶的火车,势不可挡。在这个过…

Vue项目开发注意事项(包含node/npm/cnpm等)

事项一:项目代码放在本地怎么运行起来 1、首先确定项目对应的node和npm版本 node下载地址 Index of /dist/https://nodejs.org/dist/ node 与 npm版本对应关系 Node.js — Node.js Releases 2、node卸载的时候,会自动把对应的npm卸载掉 情况1&…

GitHub:只支持 Git 作为唯一的版本库格式进行托管

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 🍚 蓝桥云课签约作者、…

秋招Day17 - Spring - MVC

Spring MVC有哪些核心组件?DispatcherServlet:前端控制器,所有HTTP请求首先经过它,分发请求到正确的处理器,并与其他组件协调。HandlerMapping:维护URL和处理器的映射关系Handler:处理器&#x…

使用mybatis实现模糊查询和精准查询切换的功能

1、首先在前端页面添加勾选框&#xff08;name设置为check&#xff09;2、mybatis代码当check勾选时&#xff0c;check不为null&#xff0c;走模糊查询like当check未勾选时&#xff0c;check为null&#xff0c;走精准查询 <if test"check ! null and check ! "&g…

Android模块化实现方案深度分析

模块化是现代 Android 开发应对项目复杂度激增、团队协作效率、编译速度瓶颈、功能复用与动态化等挑战的核心架构思想。其核心目标是高内聚、低耦合、可插拔、易维护。 一、模块化的核心价值与目标 降低复杂度&#xff1a; 将庞大单体应用拆分为独立、职责清晰的模块。加速编译…

网络基础16--VRRP技术

一、VRRP核心概念定义虚拟路由器冗余协议&#xff08;VRRP&#xff0c;Virtual Router Redundancy Protocol&#xff09;&#xff0c;可以将多个路由器加入到备份组中&#xff0c;形成一台虚拟路由器&#xff0c;承担网关功能。RFC 3768标准定义的VRRP是一种容错协议&#xff0…

最长公共前缀-leetcode

编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 “”。 示例 1&#xff1a; 输入&#xff1a;strs [“flower”,“flow”,“flight”] 输出&#xff1a;“fl” 示例 2&#xff1a; 输入&#xff1a;strs [“dog”,“racecar”,…

vs2022:C++安装opencv

vs2022:C安装opencv https://opencv.org/releases/ 1.配置包含目录 2.配置库目录 3.配置连接器 4.配置环境变量 5.重新启动VS2015/VS2017 6.测试 1.配置包含目录 (头文件) 2.配置库目录&#xff08;dll存放的库目录&#xff09; 3.配置连接器(库) 4.配置环境变量 5.重新启动VS…

智联智造:国内新能源汽车品牌AGV小车无线控制系统创新实践

行业背景&#xff1a;智能制造浪潮下的通信刚需 在全球制造业智能化转型浪潮中&#xff0c;工业4.0技术已成为提升生产效率与产品质量的核心驱动力。国内某新能源汽车品牌作为智能制造的标杆企业&#xff0c;积极投身自动化设备与智能生产系统的革新。其中&#xff0c;无线控制…

QT6 源,七章对话框与多窗体(8) 消息对话框 QMessageBox :属性,信号函数,成员函数,以及静态成员函数,源代码带注释

&#xff08;1&#xff09;消息对话框里&#xff0c;分为通知消息&#xff0c;询问消息&#xff0c;提醒消息&#xff0c;错误消息。可以直接使用本类的静态函数&#xff0c;简单。但 QT 的官方说明里&#xff0c;建议使用动态成员函数组件的消息框&#xff0c;而非使用静态函数…

DAY 7|算法篇——栈与队列(及重温数组篇章有感)

今天本来应该写两道题把这一章节结束掉&#xff0c;奈何第二题前k个高频元素需要用的二叉树相关代码实在不会写&#xff08;倒是能看懂&#xff09;等我学完二叉树再把这道题亲自写一遍吧 今天工作量比较小&#xff0c;准备从第一天的任务开始把题目重新再做一遍 239. 滑动窗…

go语言基础与进阶

&#x1f680; Go语言终极高手之路&#xff1a;从基础到架构的终极指南 Go语言&#xff0c;以其简洁的语法、卓越的性能和原生的并发模型&#xff0c;席卷了云原生和后端开发领域。然而&#xff0c;要真正驾驭Go&#xff0c;仅仅停留在会写if-else和for循环是远远不够的。真正的…

Oracle数据恢复—Oracle数据库所在分区被删除后报错的数据恢复案例

Oracle数据库数据恢复环境&故障&#xff1a; 一台服务器上一个分区存放Oracle数据库数据。由于管理员误操作不小心删除了该分区&#xff0c;数据库报错&#xff0c;无法使用。 北亚企安数据恢复工程师到达现场后&#xff0c;将故障服务器中所有硬盘以只读方式进行完整镜像。…

Prometheus+altermanager搭配钉钉报警

一、Prometheus介绍 Prometheus是一个开源系统监控和警报工具包&#xff0c;最初在 SoundCloud构建。自 2012 年成立以来&#xff0c;许多公司和组织都采用了 Prometheus&#xff0c;该项目拥有非常活跃的开发者和用户社区。它现在是一个独立的开源项目&#xff0c;独立于任何…

【小白量化智能体】应用6:根据通达信指标等生成机器学习Python程序

【小白量化智能体】应用6&#xff1a;根据通达信指标等生成机器学习Python程序 【小白量化智能体】是指能够自主或半自主地通过与环境的交互来实现目标或任务的计算实体。智能体技术是一个百科全书&#xff0c;又融合了人工智能、计算机科学、心理学和经济学等多个领域的知识&a…

k8s的calico无法启动报错解决

报错信息[INFO][1] main.go 138: Failed to initialize datastore errorGet "https://10.245.0.1:443/apis/crd.projectcalico.org/v1/clusterinformations/default": dial tcp 10.245.0.1:443: connect: no route to host 2025-07-21 06:15:42.055 [FATAL][1] main.…