设计模式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版》专栏!关注不迷路~
相关文章:

设计模式Python版 桥接模式
文章目录 前言一、桥接模式二、桥接模式示例三、桥接模式与适配器模式的联用 前言 GOF设计模式分三大类: 创建型模式:关注对象的创建过程,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式&…...

记5(一元逻辑回归+线性分类器+多元逻辑回归
目录 1、一元逻辑回归2、线性可分&线性不可分3、Iris数据集实现多元逻辑回归4、绘制分类图5、鸢尾花分类图6、多分类问题:(softmax回归)6.1、编码:自然顺序码、独热编码、独冷编码6.2、二/多分类问题:6.3、softmax…...

【Python】第七弹---Python基础进阶:深入字典操作与文件处理技巧
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【MySQL】【Python】 目录 1、字典 1.1、字典是什么 1.2、创建字典 1.3、查找 key 1.4、新增/修改元素 1.5、删除元素 1.6、遍历…...
Nginx 运维开发高频面试题详解
一、基础核心问题 原文链接:https://blog.csdn.net/weixin_51146329/article/details/142963853 1、什么是Nginx? Nginx 是一个高性能的 HTTP 和反向代理服务器,它以轻量级和高并发处理能力而闻名。Nginx 的反向代理功能允许它作为前端服务…...

下载OpenJDK
由于Oracle需要付费,并且之前我在寻找openJDK的时候,我不知道网址,并且也不知道在这个openjdk这个网址里点击哪个模块进行下载。最近我在看虚拟机相关的书籍的时候,找到了相关的网址。 注意:下面的下载都是基于可以科…...
Web3.js详解
Web1&Web2&Web3 以下是Web1、Web2和Web3的详细介绍,以及一个对比表格: Web1 定义:Web1指的是有着固定内容的非许可的开源网络。特点:在Web1时代,网站内容主要由网站管理员或创建者提供,用户只能…...

学习串行通信
本文来源: [8-1] 串口通信_哔哩哔哩_bilibili 智谱清言 ------------ 串口(Serial Port): 串口是一种应用非常广泛的通讯接口,串口成本低,容易使用,通信线路简单,可实现两个设…...

【leetcode强化练习·二叉树】同时运用两种思维解题
本文参考labuladong算法笔记[【强化练习】同时运用两种思维解题 | labuladong 的算法笔记] 有的题目可以同时用「遍历」和「分解问题」两种思路来解,你可以利用这些题目训练自己的思维。 559. N 叉树的最大深度 | 力扣 | LeetCode | 给定一个 N 叉树,…...

Rank-analysis-1.2——一款基于LCU API的排位分析工具,大四学生独立开发
LOL Rank Record Analysis:一款基于LCU API的排位分析工具,大四学生独立开发! 大家好!我是河南科技学院的大四学生,今天给大家分享一个我自己开发的软件——LOL Rank Record Analysis。这是一个基于 Riot 提供的 LCU …...

什么是门控循环单元?
一、概念 门控循环单元(Gated Recurrent Unit,GRU)是一种改进的循环神经网络(RNN),由Cho等人在2014年提出。GRU是LSTM的简化版本,通过减少门的数量和简化结构,保留了LSTM的长时间依赖…...

Google Chrome-便携增强版[解压即用]
Google Chrome-便携增强版 链接:https://pan.xunlei.com/s/VOI0OyrhUx3biEbFgJyLl-Z8A1?pwdf5qa# a 特点描述 √ 无升级、便携式、绿色免安装,即可以覆盖更新又能解压使用! √ 此增强版,支持右键解压使用 √ 加入Chrome增强…...

智慧园区综合管理系统如何实现多个维度的高效管理与安全风险控制
内容概要 在当前快速发展的城市环境中,智慧园区综合管理系统正在成为各类园区管理的重要工具,无论是工业园、产业园、物流园,还是写字楼与公寓,都在积极寻求如何提升管理效率和保障安全。通过快鲸智慧园区管理系统,用…...

【PyTorch】7.自动微分模块:开启神经网络 “进化之门” 的魔法钥匙
目录 1. 梯度基本计算 2. 控制梯度计算 3. 梯度计算注意 4. 小节 个人主页:Icomi 专栏地址:PyTorch入门 在深度学习蓬勃发展的当下,PyTorch 是不可或缺的工具。它作为强大的深度学习框架,为构建和训练神经网络提供了高效且灵活…...
从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(协议层封装)
目录 协议层设计,以IIC为例子 关于软硬件IIC 设计的一些原则 完成协议层的抽象 刨析我们的原理 如何完成我们的抽象 插入几个C语言小技巧 完成软件IIC通信 开始我们的IIC通信 结束我们的IIC通信 发送一个字节 (重要)完成命令传递和…...

Mac M1 源码安装FFmpeg,开启enable-gpl 和 lib x264
1、第一步:下载并安装minicoda curl -O https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-arm64.shsh Miniconda3-latest-MacOSX-arm64.sh2、第二步:安装必要的依赖 conda install -c conda-forge gcc make nasm yasm3、第三步ÿ…...

【Quest开发】手柄单手抓握和双手抓握物体切换
V72更新以后非常智能哈,配置物体简单多了。 选择需要被抓取的物体鼠标右键单击它,点Add Grab Interaction,按它要求的配置就行 配好以后长这样 把这个选项取消勾选就能切换成双手抓一个物体了,不需要像以前一样用各种grabTransfo…...

DB-GPT试用
继续上一篇 DB-GPT的安装 https://blog.csdn.net/berryreload/article/details/142845190 访问http://xxx:5670 访问这里 创建数据库连接 http://10.168.1.208:5670/construct/database 访问这里,点击刷新 http://10.168.1.208:5670/construct/app 刷新后才能出…...
《Ollama Python 库》
Ollama Python 库 Ollama Python 库提供了将 Python 3.8 项目与 Ollama 集成的最简单方法。 先决条件 应该安装并运行 Ollama拉取一个模型以与库一起使用:例如ollama pull <model>ollama pull llama3.2 有关可用模型的更多信息,请参阅 Ollama.com。…...
Java的Integer缓存池
Java的Integer缓冲池? Integer 缓存池主要为了提升性能和节省内存。根据实践发现大部分的数据操作都集中在值比较小的范围,因此缓存这些对象可以减少内存分配和垃圾回收的负担,提升性能。 在-128到 127范围内的 Integer 对象会被缓存和复用…...
Ubuntu16.04编译安装Cartographer 1.0版本
说明 官方文档 由于Ubuntu16.04已经是很老的系统,如果直接按照Cartographer官方安装文档安装会出现代码编译失败的问题,本文给出了解决这些问题的办法。正常情况下执行本文给出的安装方法即可成功安装。 依赖安装 # 这里和官方一致 # Install the req…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...

并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
智能职业发展系统:AI驱动的职业规划平台技术解析
智能职业发展系统:AI驱动的职业规划平台技术解析 引言:数字时代的职业革命 在当今瞬息万变的就业市场中,传统的职业规划方法已无法满足个人和企业的需求。据统计,全球每年有超过2亿人面临职业转型困境,而企业也因此遭…...

jdbc查询mysql数据库时,出现id顺序错误的情况
我在repository中的查询语句如下所示,即传入一个List<intager>的数据,返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致,会导致返回的id是从小到大排列的,但我不希望这样。 Query("SELECT NEW com…...
OCR MLLM Evaluation
为什么需要评测体系?——背景与矛盾 能干的事: 看清楚发票、身份证上的字(准确率>90%),速度飞快(眨眼间完成)。干不了的事: 碰到复杂表格(合并单元…...