设计模式Python版 桥接模式

文章目录

  • 前言
  • 一、桥接模式
  • 二、桥接模式示例
  • 三、桥接模式与适配器模式的联用


前言

GOF设计模式分三大类:

  • 创建型模式:关注对象的创建过程,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。
  • 结构型模式:关注类和对象之间的组合,包括适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式和代理模式。
  • 行为型模式:关注对象之间的交互,包括职责链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式和访问者模式。

一、桥接模式

桥接模式(Bridge Pattern)

  • 定义:将抽象部分与其实现部分分离,使它们都可以独立地变化。

  • 解决问题:如何避免在多层继承结构中类的个数出现爆炸式增长?

  • 使用场景:

    • 当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展
    • 不希望使用继承导致类爆炸的情况。在很多情况下,桥接模式可以取代多层继承方案
  • 组成:

    • 抽象类(Abstraction):定义抽象类的接口。维护一个实现对象(Implementor)的引用。
    • 扩充抽象类(RefinedAbstraction):扩展抽象类的接口。
    • 实现类接口(Implementor):定义实现类的接口,这个接口不一定要与抽象接口相同,实际上这两个接口可以完全不同。实现类接口提供基本操作,这些操作在子类中被细化。
    • 具体实现类(ConcreteImplementor):实现实现者接口并定义它的具体实现。
  • 补充说明:

    • 在使用桥接模式时,首先应该识别出一个类所具有的两个独立变化的维度,将它们设计为两个独立的继承等级结构,为两个维度都提供抽象层,并建立抽象耦合。
    • 如果系统中某个类存在两个独立变化的维度,通过该模式可以将这两个维度分离出来,使两者可以独立扩展,让系统更加符合单一职责原则。
    • 桥接模式用一种巧妙的方式处理多层继承存在的问题。桥接模式采用抽象关联取代了传统的多层继承,将类之间的静态继承关系转换为动态的对象组合关系
    • 桥接模式中体现了很多面向对象设计原则的思想,包括单一职责原则、开闭原则、合成复用原则、里氏代换原则、依赖倒转原则等。
  • 优点:

    • 在桥接模式中体现了很多面向对象设计原则的思想,包括单一职责原则、开闭原则、合成复用原则、里氏代换原则、依赖倒转原则等。
    • 扩展方便,无须修改已有代码,且不会导致类的数目增长过快。
  • 缺点:

    • 增加系统的理解与设计难度。由于关联关系建立在抽象层,要求开发者一开始就针对抽象层进行设计与编程

在这里插入图片描述

二、桥接模式示例

使用桥接模式设计跨平台图像浏览系统

  • 维度一(抽象部分):图像文件格式 BMP JPG GIF PNG
  • 维度二(具体部分):操作系统 Windows Linux UNIX
"""抽象类"""class Image:def __init__(self, imp: "ImageImp"):self.imp = imp  # 关联关系(桥)建立在抽象层def parse_file(self, file_name: str):raise NotImplementedError"""扩充抽象类"""class JPGImage(Image):def parse_file(self, file_name):# 模拟解析JPG文件并获得一个像素矩阵对象mself.imp.do_paint()print(f"{file_name},格式为JPG。")class PNGImage(Image):def parse_file(self, file_name):# 模拟解析PNG文件并获得一个像素矩阵对象mself.imp.do_paint()print(f"{file_name},格式为PNG。")class BMPImage(Image):def parse_file(self, file_name):# 模拟解析BMP文件并获得一个像素矩阵对象mself.imp.do_paint()print(f"{file_name},格式为BMP。")class GIFImage(Image):def parse_file(self, file_name):# 模拟解析GIF文件并获得一个像素矩阵对象mself.imp.do_paint()print(f"{file_name},格式为GIF。")"""实现类接口"""class ImageImp:def do_paint(self):raise NotImplementedError"""具体实现类"""class WindowsImp(ImageImp):def do_paint(self):# 调用Windows系统的绘制函数绘制像素矩阵print("在Windows操作系统中显示图像:")class LinuxImp(ImageImp):def do_paint(self):# 调用Linux系统的绘制函数绘制像素矩阵print("在Linux操作系统中显示图像:")class UnixImp(ImageImp):def do_paint(self):# 调用Unix系统的绘制函数绘制像素矩阵print("在Unix操作系统中显示图像:")

客户端代码

  • 对于客户端而言,可以针对两个维度的抽象层编程。
  • 在程序运行时再动态确定两个维度的子类,动态组合对象,将两个独立变化的维度完全解耦,以便能够灵活地扩充任一维度而对另一维度不造成任何影响。
imp = WindowsImp()  # 也可以在程序运行时获取操作系统信息来确定操作系统类型
image = JPGImage(imp)  # 也可以通过分析图像文件格式扩展名来确定具体的文件格式
image.parse_file("蒙娜丽莎")

输出结果

在Windows操作系统中显示图像:
蒙娜丽莎,格式为JPG。

三、桥接模式与适配器模式的联用

示例报表处理

  • 报表处理模块中,需要将报表显示和数据采集分开,系统可以有多种报表显示方式,也可以有多种数据采集方式

  • 桥接模式与适配器模式联用示意图

在这里插入图片描述


您正在阅读的是《设计模式Python版》专栏!关注不迷路~

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

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

相关文章

【C语言】main函数解析

文章目录 一、前言二、main函数解析三、代码示例四、应用场景 一、前言 在学习编程的过程中,我们很早就接触到了main函数。在Linux系统中,当你运行一个可执行文件(例如 ./a.out)时,如果需要传入参数,就需要…

CSS核心

CSS的引入方式 内部样式表是在 html 页面内部写一个 style 标签&#xff0c;在标签内部编写 CSS 代码控制整个 HTML 页面的样式。<style> 标签理论上可以放在 HTML 文档的任何地方&#xff0c;但一般会放在文档的 <head> 标签中。 <style> div { color: r…

变量的作用域和生命周期

一、根据变量的作用域不同&#xff0c;可分为 局部变量 和 全局变量 1. 作用域&#xff1a;变量起作用的范围&#xff08;变量定义之后&#xff0c;在哪里可以访问变量&#xff09;。 就近原则&#xff1a;当不同作用域里面有两个或者多个同名变量&#xff0c;那么遵循就近原…

力扣【669. 修剪二叉搜索树】Java题解

一开始在想为什么题目说存在唯一答案。然后发现是二叉搜索树就合理了。如下图&#xff1a;如果0节点小于low&#xff0c;那其左子树也都小于low&#xff0c;故可以排除&#xff1b;对于4&#xff0c;其右子树也是可以排除。 代码如下&#xff1a; class Solution {public Tre…

论文阅读:Realistic Noise Synthesis with Diffusion Models

这篇文章是 2025 AAAI 的一篇工作&#xff0c;主要介绍的是用扩散模型实现对真实噪声的仿真模拟 Abstract 深度去噪模型需要大量来自现实世界的训练数据&#xff0c;而获取这些数据颇具挑战性。当前的噪声合成技术难以准确模拟复杂的噪声分布。我们提出一种新颖的逼真噪声合成…

群晖Alist套件无法挂载到群晖webdav,报错【连接被服务器拒绝】

声明&#xff1a;我不是用docker安装的 在套件中心安装矿神的Alist套件后&#xff0c;想把夸克挂载到群晖上&#xff0c;方便复制文件的&#xff0c;哪知道一直报错&#xff0c;最后发现问题出在两个地方&#xff1a; 1&#xff09;挂载的路径中&#xff0c;直接填 dav &…

玩转大语言模型——配置图数据库Neo4j(含apoc插件)并导入GraphRAG生成的知识图谱

系列文章目录 玩转大语言模型——使用langchain和Ollama本地部署大语言模型 玩转大语言模型——ollama导入huggingface下载的模型 玩转大语言模型——langchain调用ollama视觉多模态语言模型 玩转大语言模型——使用GraphRAGOllama构建知识图谱 玩转大语言模型——完美解决Gra…

全程Kali linux---CTFshow misc入门(25-37)

第二十五题&#xff1a; 提示&#xff1a;flag在图片下面。 直接检查CRC&#xff0c;检测到错误&#xff0c;就直接暴力破解。 暴力破解CRC的python代码。 import binascii import struct def brute_force_ihdr_crc(filename): # 读取文件二进制数据 with open(filen…

对比DeepSeek、ChatGPT和Kimi的学术写作撰写引言能力

引言 引言部分引入研究主题&#xff0c;明确研究背景、问题陈述&#xff0c;并提出研究的目的和重要性&#xff0c;最后&#xff0c;概述研究方法和论文结构。 下面我们使用DeepSeek、ChatGPT4以及Kimi辅助引言撰写。 提示词&#xff1a; 你现在是一名[计算机理论专家]&#…

LabVIEW微位移平台位移控制系统

本文介绍了基于LabVIEW的微位移平台位移控制系统的研究。通过设计一个闭环控制系统&#xff0c;针对微位移平台的通信驱动问题进行了解决&#xff0c;并提出了一种LabVIEW的应用方案&#xff0c;用于监控和控制微位移平台的位移&#xff0c;从而提高系统的精度和稳定性。 项目背…

javaEE-6.网络原理-http

目录 什么是http? http的工作原理&#xff1a; 抓包工具 fiddler的使用 HTTP请求数据: 1.首行:​编辑 2.请求头(header) 3.空行&#xff1a; 4.正文&#xff08;body&#xff09; HTTP响应数据 1.首行&#xff1a;​编辑 2.响应头 3.空行&#xff1a; 4.响应正文…

OpenCV:闭运算

目录 1. 简述 2. 用膨胀和腐蚀实现闭运算 2.1 代码示例 2.2 运行结果 3. 闭运算接口 3.1 参数详解 3.2 代码示例 3.3 运行结果 4. 闭运算的应用场景 5. 注意事项 相关阅读 OpenCV&#xff1a;图像的腐蚀与膨胀-CSDN博客 OpenCV&#xff1a;开运算-CSDN博客 1. 简述…

C++中的类与对象(下)

上一节我们将类与对象中一个比较难的也是一个比较重要的模块学习了&#xff0c;在这节主要是一些细节上的补充。 文章目录 目录 前言 一、初始化列表 初始化列表的性质 初始化列表的总结 二、类型转换 C中的类型转换 三、static成员 static的特点 一般情况下构造函数调用顺序&a…

Versal - 基础4(VD100+Versal IBERT)

1. 简介 在之前的一篇博文中&#xff0c;我分享了在 Zynq Ultrascale MPSoC 中使用 IBERT 的方法。 《Vivado - 集成眼图分析仪 Serial I/O IBERT 误码率_vivado ibert-CSDN博客》 本文进一步探讨 Versal 中使用 IBERT 的方法。 2. 硬件平台 芯片&#xff1a;XCVE2302-SF…

《HelloGitHub》第 106 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 Python、…

英语语法 第一天

I’m a student. 我是个学生 我是个新东方的学生 I’m a student of New Oriental School 我爱你 I love you 我在心中爱你 I love you in my heart. 这是一朵花 This is a flower 这是一朵在公园里的花 This is a flower in the park.(修饰部分在修饰词后面) 主干…

“新月之智”智能战术头盔系统(CITHS)

新月人物传记&#xff1a;人物传记之新月篇-CSDN博客 相关文章链接&#xff08;更新&#xff09;&#xff1a; 星际战争模拟系统&#xff1a;新月的编程之道-CSDN博客 新月智能护甲系统CMIA--未来战场的守护者-CSDN博客 目录 一、引言 二、智能头盔控制系统概述 三、系统架…

猿人学web 19题(js逆向)

这题直接点击翻页抓包&#xff0c;然后获取seesion ID请求即可 求和代码 import requestssession requests.Session() cookies {sessionid:eao9i00r8pt4xu6uzzx2k01ttqn51yc9} urlhttps://match.yuanrenxue.cn/api/match/19?page sum0 for i in range(1,6):response sess…

c语言:编译和链接(详解)

前言 要将编译和链接&#xff0c;就不得不提及编译器是如何运作的&#xff0c;虽然这部分知识是针对于要创造编译器和创作语言的人所需要清楚的&#xff0c;但作为c语言的学习者也需要了解一下&#xff0c;修炼内功&#xff0c;尤其是对于想学习c的人而言。 编译器的运作过程…

积分和微分的区别

积分&#xff1a; 积分是由微小量求大量&#xff0c;由微观的数据求得整体的状况。运算是对总量求和。 微分&#xff1a; 微分是由大量求微小量&#xff0c;反应微观的状况&#xff0c;运算是伴随着求导。 峰值检测电路: 上图检测的误差主要来自与二极管的正向导通电压降&am…