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

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装饰器用于定义抽象方法,这些方法必须由子类实现。在没有实现抽象方法的情况下,子类无法被实例化。

使用ABCabstractmethod可以实现多态和规范化。在抽象基类中定义接口和规范,编写代码时可以基于接口编程,从而降低代码的耦合度,提高代码可复用性和可维护性。

 @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 最佳实践和编码准则 视频 前言 最佳实践是一套既定的准则,可以提高代码质量、可读性和可靠性。它们确保遵循行业标准,鼓励一致性,并促进开发人员之间的合作。通过遵循最佳实践,代码变得更容易理解、修改和调试&#xff…...

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> 二…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...