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> 二…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...
0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化
是不是受够了安装了oracle database之后sqlplus的简陋,无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话,配置.bahs_profile后也能解决上下翻页这些,但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可,…...
高考志愿填报管理系统---开发介绍
高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发,采用现代化的Web技术,为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## 📋 系统概述 ### 🎯 系统定…...
