【Python笔记-设计模式】桥接模式

一、说明

桥接模式是一种结构型设计模式, 主要用于将抽象部分与它的实现部分分离, 从而能在开发时分别使用,使系统更加灵活,易于扩展。

(一) 解决问题

所有 组合类的数量将以几何级数增长
  1. 抽象和实现分离:桥接模式可以让抽象部分和实现部分独立变化,不会相互影响,提高了系统的灵活性和可维护性。
  2. 多维度变化:当一个类有多个变化维度,且这些变化维度都可以独立变化时,可以使用桥接模式来处理这种情况。
  3. 减少子类数量:通过桥接模式,可以减少子类的数量,避免类爆炸的问题。

(二) 使用场景

  • 当一个类有多个变化维度,且这些变化维度都可以独立变化时
  • 当希望在多个对象间共享实现(如多个对象共享同一个实现类)时

二、结构

  1. 抽象部分(Abstraction)提供高层控制逻辑,依赖于完成底层实际工作的实现对象。
  2. 实现部分(Implementation)为所有具体实现声明通用接口。抽象部分仅能通过在这里声明的方法与实现对象交互。抽象部分可以列出和实现部分一样的方法,但是抽象部分通常声明一些复杂行为,这些行为依赖于多种由实现部分声明的原语操作。
  3. 具体实现(Concrete Implementations)中包括特定于平台的代码。
  4. 精确抽象(Refined Abstraction)提供控制逻辑的变体。与其父类一样,它们通过通用实现接口与不同的实现进行交互。
  5. 通常情况下,客户端(Client)仅关心如何与抽象部分合作。但是,客户端需要将抽象对象与一个实现对象连接起来。

三、伪代码

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__doc__ = """
桥接模式例:将不同形状和颜色相互独立,自由组合。无需创建组合类
"""class Shape:"""形状基类"""def __init__(self, color):self._color = colordef draw(self):passclass Color:"""颜色基类"""def paint(self):passclass Square(Shape):"""具体形状类"""def draw(self):return f"{self._color.paint()}的正方形"class Circle(Shape):"""具体形状类"""def draw(self):return f"{self._color.paint()}的圆"class Triangle(Shape):"""具体形状类"""def draw(self):return f"{self._color.paint()}的三角形"class Red(Color):"""具体颜色类"""def paint(self):return "红色"class Blue(Color):"""具体颜色类"""def paint(self):return "蓝色"# 客户端代码
if __name__ == "__main__":"""红色的圆红色的正方形蓝色的圆蓝色的正方形红色的三角形蓝色的三角形"""print(Circle(Red()).draw())print(Square(Red()).draw())print(Circle(Blue()).draw())print(Square(Blue()).draw())# 若增加一个三角形,则只需要增加一个Triangle类print(Triangle(Red()).draw())print(Triangle(Blue()).draw())

四、优缺点

优点

  • 隐藏实现细节:桥接模式可以隐藏实现细节,对客户端透明,提高了系统的安全性
  • 开闭原则:你可以新增抽象部分和实现部分,且它们之间不会相互影响
  • 单一职责原则:抽象部分专注于处理高层逻辑,实现部分处理平台细节

缺点

  • 增加代码复杂度:对于高聚合类使用桥接模式可能会让代码更加复杂

 跳转主页:【Python笔记】设计模式-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构day4

实现创建单向循环链表、创建结点、判空、输出、头插、按位置插入、尾删、按位置删除 loop_list.c #include "loop_list.h" loop_p create_head() {loop_p L(loop_p)malloc(sizeof(loop_list));if(LNULL){printf("空间申请失败\n");return NULL;}L->le…

websocket了解下

websocket请求长啥样 GET /chat HTTP/1.1 Host: example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ Sec-WebSocket-Version: 13 啥是websocket websocket是http的一种,服务器可以主动向客户端推送信息,…

进程 2月24日学习笔记

1.进程: 程序:存放在外存中的一段数据组成的文件 进程:是一个程序动态执行的过程,包括进程的创建、进程的调度、进程的消亡 2.进程相关命令: 1.top 动态查看当前系统中的所有进程信息(根据CPU占用率排序) PID:唯一识…

Linux---权限管理(ACL权限、特殊位和隐藏属性)

目录 1.ACT权限 1.1什么是ACT权限 1.2ACT图解 2.操作步骤 2.1添加测试目录、用户、组,并将用户添加到组 2.2修改目录的所有者和所属组 2.3设定权限 2.4为临时用户分配权限 2.4.1添加临时用户 2.4.2为临时用户分配特定权限 2.4.3查看目录权限,注…

NPM私服搭建(verdaccio)

官网地址:https://verdaccio.org/ 概述 Verdaccio 是一个流行的 Node.js 包管理器的代理工具,它允许您在本地或私有网络上轻松地创建和管理 npm 包仓库。通过 Verdaccio,开发团队可以建立自己的 npm 包仓库,以更好地控制和管理其依…

使用redisMQ-spring-boot-starter实现消息队列和延时队列

简介 redisMQ-spring-boot-starter是一个轻量级的、基于Redis实现的消息队列中间件,它有如下优点: 开箱即用,你几乎不用添加额外的配置支持消息队列、延时队列,并提供精细化配置参数提供消息确认机制支持虚拟空间,不…

C++ 学习之Map容器

C++ Map容器概念 C++的Map容器是一种关联容器,它提供了一种将键和值相关联的方式。它以键值对的形式存储数据,并根据键的顺序自动进行排序。 Map中的键是唯一的,而值可以重复。你可以使用键来访问对应的值,就像使用索引访问数组中的元素一样。 Map容器的特点如下: 按照…

一些可以参考的文档集合16

之前的文章集合: 一些可以参考文章集合1_xuejianxinokok的博客-CSDN博客 一些可以参考文章集合2_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合3_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合4_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合5…

IDEA查询对应功能的快捷键

首先要知道快捷键的key叫什么,然后通过key来找到对应的快捷键 比如下面这个查找删除导入未使用的类 跳转 或者安装对应插件

可视化 RAG 数据 — 用于检索增强生成的 EDA

原文地址:Visualize your RAG Data — EDA for Retrieval-Augmented Generation 2024 年 2 月 8 日 Github:https://github.com/Renumics/rag-demo/blob/main/notebooks/visualize_rag_tutorial.ipynb 为探索Spotlight中的数据,我们使用Pa…

Nodejs 第四十一章(项目架构MVC,IoC,DI)

到现在为止,我们学习了,express框架,编写接口,mysql数据库读写数据,knex,prisma ORM框架,现在是时候把这些组合到一起,并且实现一个类似于Nestjs或者java的SpringBoot的架构真正的去开发我们的n…

怎么在线生成动态gif?这个网站一定要知道

静态图片是指一张固定的、不具有动态效果的图片。它通常是由像素点组成的,可以是照片、插图、图标等。静态图片只能呈现一种特定的场景或图像,不能展示动态变化。动态图片(是由一系列静态图片组成的,通过快速连续播放这些画面&…

计算机网络-网络层,运输层,应用层

网络层/网际层 网络层的主要任务包括: 提供逻辑上的端到端通信:网络层负责确定数据的传输路径,使数据能够从源主机传输到目标主机,即实现端到端的通信。数据包的路由和转发:网络层根据目标主机的地址信息&#xff0c…

代码随想录刷题39,40天|62.不同路径

62.不同路径 想要求dp[i][j],只能有两个方向来推导出来,即dp[i - 1][j] 和 dp[i][j - 1]。 此时在回顾一下 dp[i - 1][j] 表示啥,是从(0, 0)的位置到(i - 1, j)有几条路径,dp[i][j - 1]同理。 那么很自然,dp[i][j] …

【MySQL】数据类型(常见类型)-- 详解

一、数据类型分类 二、数值类型 1、tinyint 类型 在 MySQL 中,整型可以指定是有符号的和无符号的,默认是有符号的。 有符号: 插入数据越界测试: 在 MySQL 表中建立属性列时,我们可以发现列名称在前,类型在…

小明找位置(C语言)【二分查找】

题目描述 小朋友出操&#xff0c;按学号从小到大排成一列&#xff1b;小明来迟了&#xff0c;请你给小明出个主意&#xff0c;让他尽快找到他应该排的位置。 算法复杂度要求不高于 nLog(n)&#xff1b;学号为整数类型&#xff0c;队列规模<10000&#xff1b; 输入描述 1…

深入探索pdfplumber:从PDF中提取信息到实际项目应用【第94篇—pdfplumbe】

深入探索pdfplumber&#xff1a;从PDF中提取信息到实际项目应用 在数据处理和信息提取的过程中&#xff0c;PDF文档是一种常见的格式。然而&#xff0c;要从PDF中提取信息并进行进一步的分析&#xff0c;我们需要使用适当的工具。本文将介绍如何使用Python库中的pdfplumber库来…

Vue全局指令防止重复点击(等待请求)

继《vue之全局请求loading》之后&#xff0c;总觉得全局loading有时候不太…友好&#xff0c;所以总想将loading加到被点击的元素上面&#xff0c;于是乎就想到了点击事件与请求方法相关联&#xff0c;本想重写组件的click方法&#xff0c;但是这样对组件的影响太大&#xff0c…

【分享】一道面试题的思考。。。

是一个同学面试时遇见的&#xff0c;他被鄙视了&#xff0c;大家看看自己是否可以过关。 题目如下&#xff1a; 在32位机器上&#xff0c;用你觉得最高效的方法实现memcpy函数。 void*memcpy(void*dest,void*src,unsignedintsize); 大家好好考虑一下这个题 很不容写好的 因…

华为OD机试真题-虚拟游戏理财-2023年OD统一考试(C卷)---Python3--开源

题目&#xff1a; 考察内容&#xff1a; for if max 代码&#xff1a; """ 题目分析&#xff1a;投资额*回报率投资回报 要在可接受范围内选择最优的投资方式获得最大回报最多投资2个理财产品输入&#xff1a; 产品数int; 总投资额int; 总风险int 产品投资…