Python 如何实现桥接设计模式?什么是桥接(Bridge)设计模式?

什么是桥接(Bridge)设计模式?

桥接(Bridge)设计模式是一种结构型设计模式,它的主要目的是将抽象部分与实现部分分离,以便它们可以独立地变化。这种模式通过创建一个桥接接口,连接抽象类和实现类,使得它们可以独立演化而不相互影响。

在桥接模式中,抽象部分包含一个抽象类和一个抽象接口,而实现部分也包含一个实现类和一个实现接口。抽象部分和实现部分之间通过桥接接口进行连接。

在这里插入图片描述

主要角色:

  1. 抽象部分(Abstraction): 定义抽象类和抽象接口,并包含对实现部分的引用。

  2. 扩展抽象部分(Refined Abstraction): 继承自抽象部分,扩展其功能。

  3. 实现部分(Implementor): 定义实现类和实现接口。

  4. 具体实现部分(Concrete Implementor): 实现实现接口,并提供具体的实现。

工作流程:

  1. 抽象部分包含一个抽象类,其中包含对实现部分的引用(通常是一个实现接口)。

  2. 扩展抽象部分继承自抽象部分,可以扩展其功能。

  3. 实现部分包含一个实现类和一个实现接口。

  4. 具体实现部分实现实现接口,并提供具体的实现。

  5. 抽象部分和实现部分通过桥接接口进行连接。

Python实现迭代器设计模式示例代码(一):

假设我们要绘制不同形状的图形,可以使用桥接模式将形状(抽象部分)与绘制方式(实现部分)分离。

from abc import ABC, abstractmethod

# 实现部分的接口
class DrawingAPI(ABC):
    @abstractmethod
    def draw_circle(self, x, y, radius):
        pass

    @abstractmethod
    def draw_square(self, x, y, side_length):
        pass

# 具体实现部分
class DrawingAPI1(DrawingAPI):
    def draw_circle(self, x, y, radius):
        print(f"API1: Drawing circle at ({x}, {y}) with radius {radius}")

    def draw_square(self, x, y, side_length):
        print(f"API1: Drawing square at ({x}, {y}) with side length {side_length}")

class DrawingAPI2(DrawingAPI):
    def draw_circle(self, x, y, radius):
        print(f"API2: Drawing circle at ({x}, {y}) with radius {radius}")

    def draw_square(self, x, y, side_length):
        print(f"API2: Drawing square at ({x}, {y}) with side length {side_length}")

# 抽象部分
class Shape(ABC):
    def __init__(self, drawing_api):
        self.drawing_api = drawing_api

    @abstractmethod
    def draw(self):
        pass

# 扩展抽象部分
class CircleShape(Shape):
    def __init__(self, x, y, radius, drawing_api):
        super().__init__(drawing_api)
        self.x = x
        self.y = y
        self.radius = radius

    def draw(self):
        self.drawing_api.draw_circle(self.x, self.y, self.radius)

# 扩展抽象部分
class SquareShape(Shape):
    def __init__(self, x, y, side_length, drawing_api):
        super().__init__(drawing_api)
        self.x = x
        self.y = y
        self.side_length = side_length

    def draw(self):
        self.drawing_api.draw_square(self.x, self.y, self.side_length)

# 客户端
api1 = DrawingAPI1()
api2 = DrawingAPI2()

circle = CircleShape(1, 2, 3, api1)
circle.draw()

square = SquareShape(4, 5, 6, api2)
square.draw()

在这个示例中,DrawingAPI 是实现部分的接口,DrawingAPI1DrawingAPI2 是具体实现部分。Shape 是抽象部分的抽象类,而 CircleShapeSquareShape 是扩展抽象部分。通过桥接模式,可以将绘制方式与形状分离,使得它们可以独立变化。


Python实现迭代器设计模式示例代码(二):

假设我们有一个图形用户界面(GUI)库,其中有不同的 UI 元素(按钮、文本框等),同时也有不同的平台(Windows、Linux)。我们希望这两个维度能够独立变化,即每个 UI 元素都可以在不同的平台上绘制。

from abc import ABC, abstractmethod

# 实现部分的接口
class PlatformAPI(ABC):
    @abstractmethod
    def draw_button(self, text):
        pass

    @abstractmethod
    def draw_text_box(self, text):
        pass

# 具体实现部分 - Windows
class WindowsAPI(PlatformAPI):
    def draw_button(self, text):
        print(f"Windows: Drawing button with text '{text}'")

    def draw_text_box(self, text):
        print(f"Windows: Drawing text box with text '{text}'")

# 具体实现部分 - Linux
class LinuxAPI(PlatformAPI):
    def draw_button(self, text):
        print(f"Linux: Drawing button with text '{text}'")

    def draw_text_box(self, text):
        print(f"Linux: Drawing text box with text '{text}'")

# 抽象部分
class UIElement(ABC):
    def __init__(self, platform_api):
        self.platform_api = platform_api

    @abstractmethod
    def draw(self):
        pass

# 扩展抽象部分 - 按钮
class Button(UIElement):
    def __init__(self, text, platform_api):
        super().__init__(platform_api)
        self.text = text

    def draw(self):
        self.platform_api.draw_button(self.text)

# 扩展抽象部分 - 文本框
class TextBox(UIElement):
    def __init__(self, text, platform_api):
        super().__init__(platform_api)
        self.text = text

    def draw(self):
        self.platform_api.draw_text_box(self.text)

# 客户端
windows_api = WindowsAPI()
linux_api = LinuxAPI()

button_windows = Button("Click me", windows_api)
button_linux = Button("Click me", linux_api)

text_box_windows = TextBox("Type here", windows_api)
text_box_linux = TextBox("Type here", linux_api)

# 绘制按钮和文本框,它们的绘制方式与平台独立
button_windows.draw()
button_linux.draw()

text_box_windows.draw()
text_box_linux.draw()

在这个示例中,PlatformAPI 是实现部分的接口,WindowsAPILinuxAPI 是具体实现部分。UIElement 是抽象部分的抽象类,而 ButtonTextBox 是扩展抽象部分。通过桥接模式,我们实现了 UI 元素与平台之间的解耦,使得它们可以独立变化。客户端代码可以轻松地切换不同的平台,而不需要修改 UI 元素的代码。


在实现桥接设计模式时,有哪些需要注意的地方?

在实现桥接设计模式时,有一些需要注意的地方,以确保模式的有效实施和系统的可维护性:

  1. 抽象部分和实现部分的分离: 确保抽象部分和实现部分之间的清晰分离。这是桥接模式的核心概念,确保它们可以独立演化。

  2. 接口的稳定性: 抽象部分和实现部分的接口应该相对稳定,以便它们可以独立变化而不会频繁影响到对方。

  3. 合适的桥接接口: 选择合适的桥接接口,确保它能够连接抽象部分和实现部分。这可能涉及到对系统需求的深刻理解。

  4. 实现部分的多样性: 实现部分可以有多个不同的具体实现,而不仅仅局限于一个。这使得系统更加灵活。

  5. 对扩展的支持: 桥接模式应该支持对抽象部分和实现部分的扩展,以便在系统变化时能够轻松添加新的功能。

  6. 合理的层次结构: 确保抽象部分和实现部分的层次结构是合理的,以便支持复杂的系统。

  7. 适当的组合方式: 实现部分可以通过组合或继承方式与抽象部分连接。选择适当的方式取决于系统的需求。

  8. 合适的命名规范: 对类和接口的命名应该清晰明了,反映出它们的角色和关系,以方便其他开发人员理解。

  9. 兼容性考虑: 在设计桥接接口时,考虑到实现部分可能在未来进行的变化,以确保接口的兼容性。

  10. 文档和注释: 提供清晰的文档和注释,解释桥接模式的设计、使用方法和注意事项,以便其他开发人员更容易理解和使用你的代码。

  11. 测试: 编写充分的测试来验证桥接模式的正确性。测试应该覆盖各种不同的实现部分和抽象部分的组合情况。

通过关注这些方面,可以确保实现的桥接模式在系统中的有效应用,并具有良好的灵活性和可维护性。


本文就到这里了,感谢您的阅读 。别忘了点赞、收藏~ Thanks♪(・ω・)ノ 🍇

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Node.js详解

一、是什么 Node.js 是一个开源与跨平台的 JavaScript 运行时环境 在浏览器外运行 V8 JavaScript 引擎(Google Chrome 的内核),利用事件驱动、非阻塞和异步输入输出模型等技术提高性能 可以理解为 Node.js 就是一个服务器端的、非阻塞式I/…

使用 PPO 算法进行 RLHF 的 N 步实现细节

当下,RLHF/ChatGPT 已经变成了一个非常流行的话题。我们正在致力于更多有关 RLHF 的研究,这篇博客尝试复现 OpenAI 在 2019 年开源的原始 RLHF 代码库,其仓库位置位于 openai/lm-human-preferences。尽管它具有 “tensorflow-1.x” 的特性&am…

基于SSM的校园家教兼职信息交流平台设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

三行Python代码即可将视频转Gif

一、前言 很多网站提供视频转GIF的功能,但要么收费要么有广告 实际上我们通过python,几行代码就能够实现视频转gif 二、教程 1. 安装必备库moviepy pip install moviepy -i https://pypi.tuna.tsinghua.edu.cn/simple 2. 写入代码 from moviepy.edi…

盘点一款制作电子杂志的网站,小白也能快速上手

随着科技的进步,电子宣传册已经成为了企业宣传和推广的重要工具之一。它们不仅易于制作和更新,而且可以轻松地在网络上传播,让更多的人了解您的品牌和产品。 现在,给大家推荐一款FLBOOK在线制作电子杂志平台。无需任何专业的设计技…

手写LASSO回归python实现

import numpy as np from matplotlib.font_manager import FontProperties from sklearn.datasets import make_regression from sklearn.model_selection import train_test_split import matplotlib.pyplot as pltclass Lasso():def __init__(self):pass# 数据准备def prepar…

MQTT协议详解及在Android上的应用

MQTT协议详解及在Android上的应用 一、MQTT协议简介二、MQTT工作原理三、MQTT协议特点四、MQTT在Android上的应用4.1 准备工作4.2 示例代码 五、结论 本博客将全面介绍MQTT(Message Queuing Telemetry Transport)协议的基本概念、工作原理、特点以及在An…

转录组测序学习第二弹

安装软件 前面已经安装好了conda,那么我们现在需要安装我们后续需要用到的软件 1.先进入我们前面建立的虚拟环境中 conda activate my_env2.安装软件 conda install -y sra-tools conda install -y trimmomatic conda install -y cutadapt multiqc conda install…

MATLAB 状态空间设计 —— LQG/LQR 和极点配置算法

系列文章目录 文章目录 系列文章目录前言一、相关函数 —— LQG/LQR 和极点配置算法1.1 LQR —— lqr 函数1.1.1 函数用法1.1.2 举例1.1.2.1 倒摆模型的 LQR 控制 1.2 LQG —— lqg() 函数1.2.1 函数用法1.2.2 举例 前言 状态空间控制设计方法,如 LQG/LQR 和极点配…

Google play个人开发者账号最新政策要求——必须20人连续14天封闭测试

前几天,Google play官方宣布了一项针对个人开发者账号发布新应用的政策要求,即从2023年11月13日后注册的个人开发者账号,其应用必须满足特定的测试要求,才能在 Google Play 中上架。 该政策表示,如果开发者使用的是20…

Java相关编程思想

少用继承多用“组合”——在现有类的基础上组织一个新类。 2.继承要用“is”来检验,如果继承者is被继承者,说明这是一个比较好的继承。 3.向上造型,把实现方法留给继承者去实现。(动态绑定) 4.把接口理解为抽象类的进一…

第一百七十四回 如何创建扇形渐变背景

文章目录 1. 概念介绍2. 实现方法3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 我们在 上一章回中介绍了"如何创建线性渐变背景"相关的内容,本章回中将介绍" 如何创建扇形渐变背景"。闲话休提,让我们一起Talk Flutter吧。 …

Python 如何实现适配器设计模式?什么是适配器(Adapter)设计模式?

什么是适配器设计模式? 适配器(Adapter)设计模式是一种结构型设计模式,它允许接口不兼容的类之间进行合作。适配器模式充当两个不兼容接口之间的桥梁,使得它们可以一起工作,而无需修改它们的源代码。 主要…

CTFhub-RCE-过滤空格

1. 查看当前目录&#xff1a;127.0.0.1|ls 2. 查看 flag_890277429145.php 127.0.0.1|cat flag_890277429145.php 根据题目可以知道空格被过滤掉了 3.空格可以用以下字符代替&#xff1a; < 、>、<>、%20(space)、%09(tab)、$IFS$9、 ${IFS}、$IFS等 $IFS在li…

03.智慧商城——封装请求模块、登录静态页面、图形验证码

01. 登录页静态布局 (1) 准备工作 新建 styles/common.less 重置默认样式 // 重置默认样式 * {margin: 0;padding: 0;box-sizing: border-box; }// 文字溢出省略号 .text-ellipsis-2 {overflow: hidden;-webkit-line-clamp: 2;text-overflow: ellipsis;display: -webkit-box…

C++标准模板(STL)- 类型支持 (属性查询,获取类型的对齐要求)

类型特性 类型特性定义一个编译时基于模板的结构&#xff0c;以查询或修改类型的属性。 试图特化定义于 <type_traits> 头文件的模板导致未定义行为&#xff0c;除了 std::common_type 可依照其所描述特化。 定义于<type_traits>头文件的模板可以用不完整类型实例…

本地视频AI人脸替换,一键启动,傻瓜式操作

本地无须准备配置和运行环镜&#xff0c;整个压缩包下载后解压&#xff0c;一键启动程序&#xff0c;只需一张照片和一个视频&#xff0c;就可以把视频中的人物替换成您想要的人脸。支持CPU和GPU解码&#xff0c;使用GPU解码速度较快。 所有使用的软件安装包已上传网盘&#x…

Ubuntu 20.04 调整交换分区大小

Ubuntu 调整交换分区大小 一、系统情况二、去除旧的交换分区文件三、配置并启用交换分区四、查看swap文件大小 一、系统情况 Ubuntu &#xff1a;Ubuntu 20.04.6 LTS 交换分区位置&#xff1a; cat /proc/swaps二、去除旧的交换分区文件 去掉旧的交换分区有两个步骤&#x…

【excel技巧】Excel表格里的图片如何批量调整大小?

Excel表格里面插入了很多图片&#xff0c;但是每张图片大小不一&#xff0c;如何做到每张图片都完美的与单元格大小相同&#xff1f;并且能够根据单元格来改变大小&#xff1f;今天分享&#xff0c;excel表格里的图片如何批量调整大小。 方法如下&#xff1a; 点击表格中的一…

DBA_IND_STATISTICS 字段含义

功能 展示数据库中所有索引的优化器统计信息。 字段说明 参考&#xff1a;https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-10000000000885743