当前位置: 首页 > news >正文

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.dtcms.com/a/294094.html

相关文章:

  • vite搭建react-ts项目,@别名配置
  • Python-Pytorch编码习惯
  • Windows 编程辅助技能:速览定义
  • 生成式人工智能展望报告-欧盟-02-技术方面
  • 以 “有机” 重构增长:云集从电商平台到健康生活社区的跃迁
  • 突发限制下的破局之路:国产之光 Lynx 重构 AI 开发安全壁垒
  • Petalinux的常用指令
  • Hexo - 免费搭建个人博客04 - 创建另一个私人仓库,对Hexo项目进行版本管理
  • RabbitMQ--消费端单线程与多线程
  • 电子电气架构 --- 汽车软件全生命周期
  • 小架构step系列23:加载自定义配置
  • Vue 浏览器本地存储
  • 05-ES6
  • Linux修炼:进程概念(上)
  • apache-doris安装兼datax-web配置
  • 【2025】使用vue构建一个漂亮的天气卡片
  • 加载用户设置时遇到错误找到一个带有无效“icon“的配置文件。将该配置文件默认为无图标。确保设置“icon“时,该值是图像的有效文件路径“
  • 基于php的校园招聘平台
  • 三步实现Android系统级集成:预装Google TTS + 默认引擎设置 + 语音包预缓存方案
  • ArcGIS Pro从0开始制作中国主图及黄土高原地势区域图
  • opencv学习(图像处理)
  • Linux dd命令 数据备份、转换与磁盘操作的终极工具
  • 剪枝和N皇后在后端项目中的应用
  • (进阶向)Python第十三期,opencv的图像预处理方法[1]
  • 抗辐照MCU芯片:卫星互联网光模块选型的关键考量
  • 【DataWhale】快乐学习大模型 | 202507,Task06笔记
  • OpenLayers 快速入门(二)Layer 对象
  • 身份证实名认证-身份证二要素核验接口-身份证有效性验证
  • 【通识】手机和芯片相关
  • PPO:强化学习中的近端策略优化——原理、演进与大规模应用实践