news 2026/6/5 15:13:49

Python 桥接模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python 桥接模式

Python 中的桥接模式(Bridge Pattern)

桥接模式是一种结构型设计模式,其核心目的是:
将抽象部分(Abstraction)与实现部分(Implementation)分离,使它们可以独立变化

形象比喻:就像一座桥连接两岸——“抽象”和“实现”本来紧密耦合,通过桥接模式把它们分开,让两岸各自发展而不互相影响。

为什么需要桥接模式?

如果不使用桥接模式,当抽象和实现都有多个变体时,会产生类爆炸(Cartesian product):

例如:形状(圆、正方形) × 渲染方式(矢量、光栅) → 需要 2 × 2 = 4 个类
如果再加一种形状或一种渲染方式,就需要新增更多类。

桥接模式通过组合而不是继承来解决这个问题。

典型应用场景
  • GUI 框架:窗口抽象 vs 不同平台实现(Windows、Mac、Linux)
  • 绘图程序:形状抽象 vs 渲染器(矢量、像素、光追)
  • 驱动程序:设备抽象 vs 不同协议实现
  • 消息发送:消息类型(文本、图片) vs 发送渠道(邮件、短信、推送)
Python 实现示例:形状 + 渲染器
fromabcimportABC,abstractmethod# === 实现部分(Implementation)===classRenderer(ABC):@abstractmethoddefrender_circle(self,radius:float):pass@abstractmethoddefrender_square(self,side:float):pass# 具体实现1:矢量渲染classVectorRenderer(Renderer):defrender_circle(self,radius:float):print(f"矢量渲染:绘制半径为{radius}的圆")defrender_square(self,side:float):print(f"矢量渲染:绘制边长为{side}的正方形")# 具体实现2:光栅渲染(像素)classRasterRenderer(Renderer):defrender_circle(self,radius:float):print(f"光栅渲染:绘制半径为{radius}的圆(像素点)")defrender_square(self,side:float):print(f"光栅渲染:绘制边长为{side}的正方形(像素填充)")# === 抽象部分(Abstraction)===classShape(ABC):def__init__(self,renderer:Renderer):self.renderer=renderer# 通过组合持有实现@abstractmethoddefdraw(self):pass@abstractmethoddefresize(self,factor:float):pass# 细化抽象:圆classCircle(Shape):def__init__(self,renderer:Renderer,radius:float):super().__init__(renderer)self.radius=radiusdefdraw(self):self.renderer.render_circle(self.radius)defresize(self,factor:float):self.radius*=factorprint(f"圆形调整大小:新半径{self.radius}")# 细化抽象:正方形classSquare(Shape):def__init__(self,renderer:Renderer,side:float):super().__init__(renderer)self.side=sidedefdraw(self):self.renderer.render_square(self.side)defresize(self,factor:float):self.side*=factorprint(f"正方形调整大小:新边长{self.side}")# 客户端使用if__name__=="__main__":# 可以自由组合抽象和实现vector=VectorRenderer()raster=RasterRenderer()circle1=Circle(vector,5)circle1.draw()# 矢量圆circle1.resize(2)circle1.draw()circle2=Circle(raster,10)circle2.draw()# 光栅圆square=Square(vector,4)square.draw()# 切换渲染器非常容易another_circle=Circle(raster,3)another_circle.draw()

输出

矢量渲染:绘制半径为 5 的圆 圆形调整大小:新半径 10.0 矢量渲染:绘制半径为 10.0 的圆 光栅渲染:绘制半径为 10 的圆(像素点) 矢量渲染:绘制边长为 4 的正方形 光栅渲染:绘制半径为 3 的圆(像素点)

现在新增一种形状(如 Triangle)只需继承 Shape,新增一种渲染器(如 OpenGLRenderer)只需实现 Renderer 接口,无需修改现有代码

桥接模式结构总结
角色说明
Abstraction抽象类(Shape),持有 Implementation 引用
RefinedAbstraction细化抽象(Circle、Square)
Implementor实现接口(Renderer)
ConcreteImplementor具体实现(VectorRenderer、RasterRenderer)
桥接模式 vs 其他模式对比
模式目的组合 vs 继承典型场景
桥接分离抽象与实现,独立变化组合多维度变化(如平台+功能)
适配器接口转换组合整合不兼容接口
策略算法可替换组合行为变化
装饰器动态添加职责组合功能增强
Python 中的实用建议
  • Python 是动态语言,桥接模式实现非常自然(通过组合注入实现)。
  • 常与依赖注入结合使用。
  • 在 GUI、游戏引擎、跨平台库中非常常见(如 PyQt/PySide 的后台实现)。
  • 不要与继承混用过度——桥接强调“组合优于继承”。
更现实的例子:消息发送系统
classMessageSender(ABC):@abstractmethoddefsend(self,message:str):passclassEmailSender(MessageSender):defsend(self,message:str):print(f"通过 Email 发送:{message}")classSMSSender(MessageSender):defsend(self,message:str):print(f"通过 SMS 发送:{message}")classMessage(ABC):def__init__(self,sender:MessageSender):self.sender=sender@abstractmethoddefprepare(self)->str:passdefsend_message(self):content=self.prepare()self.sender.send(content)classTextMessage(Message):def__init__(self,sender,text):super().__init__(sender)self.text=textdefprepare(self):returnf"文本消息:{self.text}"classUrgentMessage(Message):defprepare(self):returnf"【紧急】{self.text.upper()}!!!"# 使用:自由组合email_text=TextMessage(EmailSender(),"会议通知")email_text.send_message()sms_urgent=UrgentMessage(SMSSender(),"火警警报")sms_urgent.send_message()

桥接模式是处理多维度变化的强大工具,在大型系统设计中非常有用。

如果你想看更复杂的例子(如 GUI 跨平台桥接、数据库驱动桥接),或者与其他模式(如抽象工厂)结合使用,欢迎继续问!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/2 4:07:04

openmv与stm32通信实时性分析:STM32F4性能测试报告

OpenMV与STM32通信实时性实测:如何榨干STM32F4的串口性能?你有没有遇到过这种情况——OpenMV明明“咔嚓”一下就识别出了目标,但你的小车却慢半拍地转向?或者AGV在避障时突然抖了一下,像是卡顿了一帧视觉?别…

作者头像 李华
网站建设 2026/5/14 16:02:03

Dify平台的会话上下文长度管理策略

Dify平台的会话上下文长度管理策略 在构建智能客服、AI助手或内容生成系统时,你是否曾遇到这样的尴尬:用户刚聊到第三轮,AI突然“失忆”,忘了之前说好的角色设定;或者更糟——请求直接报错,提示“上下文过长…

作者头像 李华
网站建设 2026/5/29 11:17:02

Open-AutoGLM性能提升5倍的秘密:动态图学习机制深度剖析

第一章:Open-AutoGLM性能提升5倍的秘密:动态图学习机制深度剖析Open-AutoGLM 在图神经网络(GNN)领域实现了高达5倍的性能提升,其核心突破在于引入了创新的动态图学习机制。该机制不再依赖静态图结构,而是根…

作者头像 李华
网站建设 2026/6/4 22:48:44

图文转Word自动化文档生成终极指南:一键生成,效率翻倍

还在为图文排版抓狂吗?会议记录、产品说明、培训材料...每次都要花几个小时复制粘贴、调整格式?今天我要为你分享一个3分钟搞定图文转Word的方法,让你彻底告别手动排版的烦恼! 【免费下载链接】Awesome-Dify-Workflow 分享一些好用…

作者头像 李华
网站建设 2026/6/4 1:57:45

IDM激活脚本完整使用指南:三步实现永久试用期锁定

IDM激活脚本完整使用指南:三步实现永久试用期锁定 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 还在为Internet Download Manager试用期到期而烦恼…

作者头像 李华
网站建设 2026/5/31 16:19:55

5分钟快速上手:Sun-Panel打造终极NAS导航中心

5分钟快速上手:Sun-Panel打造终极NAS导航中心 【免费下载链接】sun-panel 一个NAS导航面板、Homepage、浏览器首页。 项目地址: https://gitcode.com/gh_mirrors/su/sun-panel 想要让你的NAS管理更高效、界面更个性化吗?Sun-Panel作为一款开源的N…

作者头像 李华