Python桥接模式介绍、使用
一、Python桥接模式介绍
概念:
Python桥接模式(Bridge Pattern)是一种软件设计模式,用于将抽象部分与其实现部分分离,使它们可以独立地变化。
它可以通过使用桥接接口来创建一个桥接对象来连接抽象和实现部分。
功能:
桥接模式的主要功能是将抽象部分和实现部分解耦,使得它们可以独立地变化。
在实现部分改变时,抽象部分不会受到影响,反之亦然。这使得系统更加灵活和可扩展。
优点:
1.分离抽象和实现部分,使得系统更容易扩展和维护;
2.提高代码的可重用性和可扩展性;
3.对于需要在多个平台上运行的程序,桥接模式可以避免代码的重复编写。
缺点:
1.增加了系统的复杂度,需要设计更多的类和接口;
2.桥接模式需要使用抽象类和接口,这会增加代码的复杂度。
应用场景:
1.当需要扩展一个类的功能时,使用桥接模式可以避免修改原来的类;
2.当一个类有多个实现时,使用桥接模式可以避免在多个实现之间进行切换;
3.当需要在多个平台上运行的程序时,使用桥接模式可以避免编写重复的代码。
使用方式:
桥接模式的实现方式是使用抽象类和接口来分离抽象和实现部分。
抽象部分由抽象类或接口来定义,实现部分由具体的实现类来继承。
桥接接口将抽象和实现部分连接起来,使得它们可以独立地变化。
在应用程序开发中的应用:
Python桥接模式在应用程序开发中经常被使用。
例如,在大型的软件系统中,很多功能都需要进行扩展和修改,使用桥接模式可以避免对原来的代码进行修改。
另外,在需要在多个平台上运行的程序中,桥接模式可以避免编写重复的代码,提高代码的可重用性和可扩展性。
二、使用
工作原理:
桥接模式的工作原理是将抽象部分和实现部分分离,使得它们可以独立地变化。
在实现部分改变时,抽象部分不会受到影响,反之亦然。
这使得系统更加灵活和可扩展。
具体实现方式是使用抽象类和接口来分离抽象和实现部分,使用桥接接口来连接抽象和实现部分。
示例:
假设我们正在开发一个电脑品牌的销售系统,需要将电脑品牌和操作系统分离,使得系统更加灵活和可扩展。这时候就可以使用Python桥接模式来实现。
1.首先定义抽象类Computer和操作系统的接口OperatingSystem:
2.实现具体的电脑品牌和操作系统:
3.最后使用桥接接口将抽象和实现部分连接起来:
# abc模块提供了一个称为ABC的类和一个称为abstractmethod的装饰器,用于抽象基类(Abstract Base Classes)
from abc import ABC, abstractmethodclass Computer(ABC):@abstractmethod # @abstractmethod是Python装饰器语法中的一种,用于定义抽象方法。抽象方法是一种在抽象基类中声明但不实现的方法。其他非抽象子类必须实现这些方法来满足抽象基类的规范。def run(self):passclass OperationSystem(ABC):@abstractmethoddef install(self):passclass Linux(OperationSystem):def install(self):print("install Linux operation system")class Dell(Computer): # 继承抽象类Computerdef __init__(self, os):self._os = osdef run(self): # 实现抽象类中声明的run方法print("run Dell Computer")self._os.install()class Lenovo(Computer):def __init__(self, os):self._os = osdef run(self):print("run Lenovo")self._os.install()class Windows(OperationSystem):def install(self):print("install Windows operation system")class Linux(OperationSystem):def install(self):print("install Linux operation system")# 使用桥接接口将抽象和实现部分连接起来
os = Windows()
dell = Dell(os)
dell.run()os = Linux()
lenovo = Lenovo(os)
lenovo.run()
这样就可以将电脑品牌和操作系统分离开来,实现了桥接模式,使得系统更加灵活和可扩展。如果需要增加新的电脑品牌或操作系统,只需要实现抽象类和接口即可,不需要修改原来的代码
运行结果:
run Dell Computer
install Windows operation system
run Lenovo
install Linux operation system
三、其它
from abc import ABC, abstractmethod说明
在Python中,abc模块提供了一个称为ABC的类和一个称为abstractmethod的装饰器,用于抽象基类(Abstract Base Classes)。抽象基类是一种特殊的类,用于定义接口和规范,并且不能被实例化。
ABC是所有抽象基类的基类,它本身不是抽象类。通过继承ABC类可以将普通类变成抽象类。abstractmethod装饰器用于定义抽象方法,这些方法必须由子类实现。在没有实现抽象方法的情况下,子类无法被实例化。
使用ABC和abstractmethod可以实现多态和规范化。在抽象基类中定义接口和规范,编写代码时可以基于接口编程,从而降低代码的耦合度,提高代码可复用性和可维护性。
@abstractmethod说明
@abstractmethod是Python装饰器语法中的一种,用于定义抽象方法。抽象方法是一种在抽象基类中声明但不实现的方法。其他非抽象子类必须实现这些方法来满足抽象基类的规范。
使用@abstractmethod装饰器时,需要在抽象基类中定义一个方法,并在该方法上使用装饰器。具体语法如下:
from abc import ABC, abstractmethodclass MyAbstractClass(ABC):@abstractmethoddef my_abstract_method(self):pass
在上面的代码中,MyAbstractClass是一个抽象基类,包含一个抽象方法my_abstract_method。使用@abstractmethod装饰器修饰这个方法表示它是一个抽象方法,必须由其子类实现。在抽象方法中通常不会实现任何具体功能,而只是提供了一个框架或接口,以便子类实现。
可以在非抽象基类中实现抽象方法,也可以在非抽象基类中再次声明为抽象方法。如果子类未实现其在抽象基类中声明的所有抽象方法,则该子类也将成为抽象类。
相关文章:
Python桥接模式介绍、使用
一、Python桥接模式介绍 概念: Python桥接模式(Bridge Pattern)是一种软件设计模式,用于将抽象部分与其实现部分分离,使它们可以独立地变化。 它可以通过使用桥接接口来创建一个桥接对象来连接抽象和实现部分。 功能…...
ChatGPT在知识图谱的构建和更新中的应用如何?
ChatGPT在知识图谱的构建和更新中具有重要的应用潜力。知识图谱是一种用于表示和存储结构化知识的图形化数据模型,通常由实体、属性和关系组成。知识图谱的构建和更新是一个复杂而关键的过程,涉及知识的收集、组织、链接和推理。ChatGPT作为一种预训练语…...
JS正则表达式:常用正则手册/RegExp/正则积累
一、正则基础语法 JavaScript 正则表达式 | 菜鸟教程 JS正则表达式语法大全(非常详细) 二、使用场景 2.1、校验中国大陆手机号的正则表达式 正则 /^1[3456789]\d{9}$/解释 序号正则解释1^1以数字 1 开头2[3456789]第二位可以是 3、4、5、6、7、8、…...
自动化测试框架unittest与pytest的区别!
引言 前面文章已经介绍了python单元测试框架,大家平时经常使用的是unittest,因为它比较基础,并且可以进行二次开发,如果你的开发水平很高,集成开发自动化测试平台也是可以的。而这篇文章主要讲unittest与pytest的区别&…...
【Git】
学习来自于: 女朋友乱用Git,差点把我代码删了。。。 一些常用的Git 知识点整理 关于Git这一篇就够了 Git基本命令大全 30分钟精通Git,学不会来找我 Git 版本管理 | 莫烦PYTHON Git 代码版本管理教程 文章目录 【前言】集中式与分布式的…...
[论文笔记] CLRerNet: Improving Confidence of Lane Detection with LaneIoU
Honda, Hiroto, and Yusuke Uchida. “CLRerNet: Improving Confidence of Lane Detection with LaneIoU.” arXiv preprint arXiv:2305.08366 (2023). 2023.05 出的一篇车道线检测的文章, 效果在CULane, CurveLanes SOTA 文章目录 简介LaneIoULineIoU存在问题为什么使用LaneIo…...
LeetCode|backtracking|review:40. 131. 93. 47. 332. | 37. Sudoku Solver
复习: 40. Combination Sum II [1,1,2,3]中,答案里有[1,1,2], 但是不能有两个[1,2,3] 131. Palindrome Partitioning 每个for都是在给定的start之后找一个palindrome。当start 93. Restore IP Addresses forloop每次loop都是在给定的start的后三个数…...
被泼冷水后,谁能超越微服务?
历史总会重演。一切刚过去的,又会被重新提起。开源项目Codename One的联合创始人Shai,曾是Sun Microsystems开源LWUIT项目的共同作者,参与了无数开源项目。作为最早一批Java开发者,最近感慨道:单体,又回来了…...
多线程(JavaEE初阶系列5)
目录 前言: 1.什么是定时器 2.标准库中的定时器及使用 3.实现定时器 结束语: 前言: 在上一节中小编给大家介绍了多线程中的两个设计模式,单例模式和阻塞式队列模式,在单例模式中又有两种实现方式一种是懒汉模式&a…...
Minimum Snap闭式求解相关公式推导
文章目录 1 M i n i m u m Minimum Minimum S n a p Snap Snap闭式求解的推导1.1 二次规划等式约束构建1.2 求 d d d1.3 转成无约束优化问题 1 M i n i m u m Minimum Minimum S n a p Snap Snap闭式求解的推导 可以看看我的这几篇Blog1,Blog2,Blog…...
Spring源码(五)— 解析XML配置文件(一) bean标签解析流程
前面几章的内容已经介绍了BeanFactory创建前的准备工作,以及加载XML配置文件前的准备的步骤。本章会着重介绍解析XML的步骤。 registerBeanDefinitions 前几个方法不做过多的赘述,着重看registerBeanDefinitions方法中解析XML的步骤。 public int regi…...
隐私政策声明
http://lxfamn.cn/tools 我们注重对您个人隐私的保护。有时候我们需要某些信息才能为您提供您请求的服务,本隐私声明解释了这些情况下的数据收集和使用情况。本隐私声明适用于本网站的所有相关服务。如果您访问本网站、使用本网站的任何服务,那么您便接受…...
Flutter 最佳实践和编码准则
Flutter 最佳实践和编码准则 视频 前言 最佳实践是一套既定的准则,可以提高代码质量、可读性和可靠性。它们确保遵循行业标准,鼓励一致性,并促进开发人员之间的合作。通过遵循最佳实践,代码变得更容易理解、修改和调试ÿ…...
LangChain Agents深入剖析及源码解密上(一)
LangChain Agents深入剖析及源码解密上(一) LangChain Agents深入剖析及源码解密上 Agent工作原理详解 本节会结合AutoGPT的案例,讲解LangChain代理(Agent)为核心的内容。我们前面已经谈了代理本身的很多内容,也看了绝大部分的源代码,例如:ReAct的源代码,还有mrkl的源代…...
css定义超级链接a标签里面的title的样式
效果: 代码: 总结:此css 使用于任何元素,不仅仅是a标签!...
hcip——路由策略
要求: 基础配置 AR1 [R1]int g 0/0/0 [R1-GigabitEthernet0/0/0]ip add 12.0.0.1 24[R1-GigabitEthernet0/0/0]int g 0/0/1 [R1-GigabitEthernet0/0/1]ip add 14.0.0.1 24[R1]int loop0 [R1-LoopBack0]ip add 1.1.1.1 24[R1]rip 1 [R1-rip-1]vers 2 [R1-rip-1]net…...
ReID网络:MGN网络(1) - 概述
Start MGN 1. 序言 现代基于感知的信息中,视觉信息占了80~85%。基于视觉信息的处理和分析被应用到诸如安防、电力、汽车等领域。 以安防市场为例,早在2017年,行业咨询公司IHS Market,我国在公共和私人领域安装有摄像头约1.76亿…...
C++数据结构笔记(10)递归实现二叉树的三序遍历
对于三种遍历方式来说,均为先左后右!区别在于根结点的位置顺序 先序遍历:根——左——右 中序遍历:左——根——右 后序遍历:左——右——根 (所谓先中后的顺序,是指根结点D先于子树还是后于…...
hMailServer-5.3.3-B1879.exe
hMailServer-5.3.3-B1879.exe...
后端校验JSR303
目录 一、导入依赖 二、实现步骤 三、分组校验 四、自定义校验 一、导入依赖 <dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId><version>2.0.1.Final</version></dependency> 二…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
