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

Python与设计模式--桥梁模式

23种计模式之 前言 +(5)单例模式、工厂模式、简单工厂模式、抽象工厂模式、建造者模式、原型模式、+(7)代理模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式、桥梁模式、+(11)策略模式、责任链模式、命令模式、中介者模式、模板模式、迭代器模式、访问者模式、观察者模式、解释器模式、备忘录模式、状态模式 + 设计原则

11-Python与设计模式–桥梁模式

一、画笔与形状

在介绍原型模式的一节中,我们举了个图层的例子,这一小节内容,我们同样以类似画图的例子,
说明一种结构类设计模式:桥梁模式。
在一个画图程序中,常会见到这样的情况:有一些预设的图形,如矩形、圆形等,还有一个对象-画笔,
调节画笔的类型(如画笔还是画刷,还是毛笔效果等)并设定参数(如颜色、线宽等),选定图形,
就可以在画布上画出想要的图形了。要实现以上需求,先从最抽象的元素开始设计,
即形状和画笔(暂时忽略画布,同时忽略画笔参数,只考虑画笔类型)。
class Shape:name=""param=""def __init__(self,*param):passdef getName(self):return self.namedef getParam(self):return self.name,self.paramclass Pen:shape=""type=""def __init__(self,shape):self.shape=shapedef draw(self):pass

形状对象和画笔对象是最为抽象的形式。接下来,构造多个形状,如矩形和圆形:

class Rectangle(Shape):def __init__(self,long,width):self.name="Rectangle"self.param="Long:%s Width:%s"%(long,width)print "Create a rectangle:%s"%self.param
class Circle(Shape):def __init__(self,radius):self.name="Circle"self.param="Radius:%s"%radiusprint "Create a circle:%s"%self.param

紧接着是构造多种画笔,如普通画笔和画刷:

class NormalPen(Pen):def __init__(self,shape):Pen.__init__(self,shape)self.type="Normal Line"def draw(self):print "DRAWING %s:%s----PARAMS:%s"%(self.type,self.shape.getName(),self.shape.getParam())
class BrushPen(Pen):def __init__(self,shape):Pen.__init__(self,shape)self.type="Brush Line"def draw(self):print "DRAWING %s:%s----PARAMS:%s" % (self.type,self.shape.getName(), self.shape.getParam())

业务中的逻辑如下:

if __name__=="__main__":normal_pen=NormalPen(Rectangle("20cm","10cm"))brush_pen=BrushPen(Circle("15cm"))normal_pen.draw()brush_pen.draw()

打印如下:

Create a rectangle:Long:20cm Width:10cm Create a circle:Radius:15cm
DRAWING Normal Line:Rectangle----PARAMS:(‘Rectangle’, ‘Long:20cm
Width10cm’) DRAWING Brush Line:Circle----PARAMS:(‘Circle’,
‘Radius:15cm’)

二、桥梁模式

桥梁模式又叫桥接模式,定义如下:将抽象与实现解耦(注意此处的抽象和实现,并非抽象类和实现类的那种
关系,而是一种角色的关系,这里需要好好区分一下),可以使其独立变化。在形如上例中,Pen只负责画,
但没有形状,它终究是不知道要画什么的,所以我们把它叫做抽象化角色;而Shape是具体的形状,我们把它
叫做实现化角色。抽象化角色和实现化角色是解耦的,这也就意味着,所谓的桥,就是抽象化角色的抽象类和
实现化角色的抽象类之间的引用关系。

三、桥梁模式的优点和应用场景

优点:
1、抽象角色与实现角色相分离,二者可以独立设计,不受约束;
2、扩展性强:抽象角色和实现角色可以非常灵活地扩展。应用场景:
1、不适用继承或者原继承关系中抽象类可能频繁变动的情况,可以将原类进行拆分,拆成实现化角色和抽象化角色。例如本例中,若将形状、粗细、绘画样式等属于汇集在一个类中,一旦抽象类中有所变动,将造成巨大的风险;
2、重用性比较大的场景。比如开关控制逻辑的程序,开关就是抽象化角色,开关的形式有很多种,操作的实现化角色也有很多种,采用桥梁模式,(如当前例子)开关即可进行复用,整体会将设计的粒度减小。

四、桥梁模式的缺点

1、增加对系统理解的难度。

相关文章:

Python与设计模式--桥梁模式

23种计模式之 前言 (5)单例模式、工厂模式、简单工厂模式、抽象工厂模式、建造者模式、原型模式、(7)代理模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式、桥梁模式、(11)策略模式、责任链模式、命令模式、中介者模…...

Linux下查看目录大小

查看目录大小 Linux下查看当前目录大小,可用一下命令: du -h --max-depth1它会从下到大的显示文件的大小。...

鸿蒙原生应用/元服务开发-AGC分发如何下载管理Profile

一、收到通知 尊敬的开发者: 您好,为支撑鸿蒙生态发展,HUAWEI AppGallery Connect已于X月XX日完成存量HarmonyOS应用/元服务的Profile文件更新,更新后Profile文件中已扩展App ID信息;后续上架流程会检测API9以上Harm…...

解决warning: #188-D: enumerated type mixed with another type问题

出现问题处如下, 指示在代码的某处将枚举类型与另一种类型混合使用,这种警告通常在将枚举类型与其他类型进行操作或赋值时出现 enum Mode {MODE_IDLE,MODE_1,MODE_2,MODE_3,MODE_4, }; enum Mode currentMode MODE_IDLE;currentMode (currentMode 1)…...

docker的知识点,以及使用

Docker 是一个开源的应用容器引擎,可以让开发者将应用程序及其依赖项打包至一个可移植的容器中,从而实现快速部署、可扩展和依赖项隔离等特性。下面是 Docker 的一些知识点以及使用方法: Docker 的组成部分包括 Docker 引擎、Docker 镜像、Do…...

WTM(基于Blazor)问题处理记录

问题描述一 有个需求,需要访问内网网络共享文件夹中的文件,有域控限制。 一开始直接在本地映射一个网络驱动器,然后像本地磁盘一样访问共享文件夹里的文件,比如:Y:\ 。 然后直接在程序中访问共享文件夹中的文件,如下代码: DirectoryInfo directoryInfo = new Direct…...

ubuntu 安装 towhee

安装Towhee pip3 install towhee如果你想在 towhee 中安装模型 pip3 install towhee.models打开python终端 python3引入towhee 数据转换是 Towhee 的核心;管道只是在有向无环图中连接在一起的一系列转换。所有预构建的 Towhee 管道都有代表当前任务的名称。 fr…...

ERP软件对Oracle安全产品的支持

这里的ERP软件仅指SAP ECC和Oracle EBS。 先来看Oracle EBS: EBS的认证查询方式,和数据库认证是一样的。这个体验到时不错。 结果中和安全相关的有: Oracle Database VaultTransparent Data Encryption TDE被支持很容易理解,…...

Linux 基础-常用的命令和搭建 Java 部署环境

文章目录 目录相关查看目录中的内容查看目录当前的完整路径切换目录 文件相关创建文件查看文件内容写文件vim 基础 创建删除创建目录 移动和复制移动(剪切粘贴)复制(复制粘贴) 搭建 Java 部署环境1. 安装 jdk2. 安装 tomcat1). 我们在自己电脑上下好 tomcat2). 从官网下载的 .z…...

c语言总结(解题方法)

项目前期处理: 1.首先需要确定项目的背景知识,即主要的难点知识,如指针,数组,结构体,以检索自己是否对项目所需的背景知识足够了解。 2.确定问题实现方法,即题目本身的实现方法,在c语…...

Webpack的ts的配置详细教程

文章目录 前言ts是什么?基础配置LoaderSource MapsClient types使用第三方类库导入其他资源 后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:webpack 🐱‍👓博主在前端领域还有很多知识和技术需要掌握…...

传智杯第五届题解

B.莲子的机械动力学 分析&#xff1a;这题有个小坑&#xff0c;如果是00 0&#xff0c;结果记得要输出0。 得到的教训是&#xff0c;避免前导0出现时&#xff0c;要注意答案为0的情况。否则有可能会没有输出 #include<assert.h> #include<cstdio> #include<…...

Android 通过demo调试节点权限问题

Android 通过demo调试节点权限问题 近来收到客户反馈提到在应用层无法控制节点&#xff0c;于是写了一个简单的demo来验证节点的IO权限&#xff0c;具体调试步骤就是写一个按钮点击事件&#xff0c;当点击按钮时将需要验证的节点写为1&#xff08;节点默认为1则写为0&#xff…...

邮政快递物流查询,将指定某天签收的单号筛选出来

批量查询邮政快递单号的物流信息&#xff0c;将指定某天签收的单号筛选出来。 所需工具&#xff1a; 一个【快递批量查询高手】软件 邮政快递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;并登录 步骤2&#xff1a;点击主界面左…...

Java 8 lambda的一个编译bug

最近利用github action向Maven中央仓库发布企业微信SDK时会失败&#xff0c;从日志中发现是系统资源耗尽了&#xff0c;日志如下&#xff1a; [INFO] Changes detected - recompiling the module! :dependency [INFO] Compiling 35 source files with javac [debug target 8] …...

无人机覆盖路径规划综述

摘要&#xff1a;覆盖路径规划包括找到覆盖某个目标区域的每个点的路线。近年来&#xff0c;无人机已被应用于涉及地形覆盖的多个应用领域&#xff0c;如监视、智能农业、摄影测量、灾害管理、民事安全和野火跟踪等。本文旨在探索和分析文献中与覆盖路径规划问题中使用的不同方…...

【代码随想录】算法训练计划37

贪心 1、738. 单调递增的数字 题目&#xff1a; 输入: n 10 输出: 9 思路&#xff1a; func monotoneIncreasingDigits(n int) int {// 贪心&#xff0c;利用字符数组s : strconv.Itoa(n)ss : []byte(s)leng : len(ss)if leng < 1 {return n}for i:leng-1; i>0; i-- …...

网络基础_1

目录 网络基础 协议 协议分层 OSI七层模型 网络传输的基本流程 数据包的封装和分用 IP地址和MAC地址 网络基础 网络就是不同的计算机之间可以进行通信&#xff0c;前面我们学了同一台计算机之间通信&#xff0c;其中有进程间通信&#xff0c;前面学过的有管道&#xff…...

机器学习:DBSCAN算法(效果比K-means好)

基本概念 核心对象&#xff1a;以点为圆心半径为r的圆&#xff0c;如果圈里面的样本点大于给定的阈值(minPts)&#xff0c;那么这个点就叫做核心点 直接密度可达&#xff1a;点p在q为圆心的圆内 密度可达&#xff1a; p1与p2直接密度可达&#xff0c;p2与p3直接密度可达&…...

在Spring Boot中隔离@Async异步任务的线程池

在异步任务执行的时候&#xff0c;我们知道其背后都有一个线程池来执行任务&#xff0c;但是为了控制异步任务的并发不影响到应用的正常运作&#xff0c;我们需要对线程池做好相关的配置&#xff0c;以防资源过度使用。这个时候我们就考虑将线程池进行隔离了。 那么我们为啥要…...

计算机毕业设计springboot在线阅读平台的设计与实现 基于SpringBoot的数字化图书阅读与积分兑换服务平台 SpringBoot框架下的网络文献资源管理与读者互动系统

计算机毕业设计springboot在线阅读平台的设计与实现 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。 随着互联网技术的飞速发展和移动智能终端的普及&#xff0c;人们的阅读习惯…...

CVPR 2024人脸黑科技:3D头像重建如何用单张自拍搞定?附开源项目推荐

CVPR 2024单图3D头像重建技术实战&#xff1a;从算法原理到开源工具落地 当你在社交媒体上传自拍时&#xff0c;是否想过这张平面照片能瞬间转化为可360度旋转的数字化身&#xff1f;CVPR 2024最新研究成果正在让这个想象成为现实——无需专业设备&#xff0c;仅用普通手机拍摄…...

Windows 10/11下Frida逆向分析环境搭建避坑指南(含ADB驱动安装)

Windows 10/11逆向工程实战&#xff1a;Frida环境搭建全流程与疑难解析 逆向工程的世界就像一场数字考古&#xff0c;而Frida无疑是当前最趁手的工具之一。但很多新手在Windows平台搭建Frida环境时&#xff0c;往往会陷入Python版本地狱、ADB驱动失效、设备连接失败等连环陷阱。…...

React19 + Tailwindcss V4 实战:手把手教你打造一个高颜值标签输入与随机选择器

React19 Tailwindcss V4 实战&#xff1a;构建智能标签输入与随机决策工具 在今天的快节奏生活中&#xff0c;我们每天都要做出无数选择——从午餐吃什么到周末去哪玩&#xff0c;甚至团队建设时随机点名。作为开发者&#xff0c;我们可以用技术让这些决策过程变得有趣而高效。…...

全球AI薪资热力图:旧金山VS深圳的残酷对比

一场不平等的技术竞赛当我们谈论人工智能&#xff08;AI&#xff09;的未来时&#xff0c;旧金山湾区与深圳无疑是最为闪耀的两个坐标。前者是硅谷的心脏&#xff0c;全球科技创新的策源地&#xff1b;后者是中国乃至世界硬件制造与新兴科技应用的前沿阵地。然而&#xff0c;对…...

实战应用:在快马平台构建带缺陷的微项目,演练测试面试实战题

今天想和大家分享一个特别实用的软件测试学习方法——通过构建带缺陷的微项目来演练测试面试题。这个方法不仅帮助我顺利通过了最近的面试&#xff0c;还让我对测试工作有了更深入的理解。 为什么选择在线书店作为测试项目&#xff1f; 在线书店系统包含了软件测试中最常见的…...

无人驾驶车辆轨迹跟踪MPC、LQR、PP算法对比仿真(带说明文档)

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和…...

Clawdbot 是如何实现永久记忆的?

下文是如何构建的在深入探讨记忆之前&#xff0c;我们先来理解模型在每次请求时能看到什么&#xff1a;[0] 系统提示词&#xff08;静态指令 条件指令&#xff09; [1] 项目上下文&#xff08;引导文件&#xff1a;AGENTS.md、SOUL.md 等&#xff09; [2] 对话历史&#xff08…...

Translumo完全指南:5分钟掌握实时屏幕翻译,打破语言障碍

Translumo完全指南&#xff1a;5分钟掌握实时屏幕翻译&#xff0c;打破语言障碍 【免费下载链接】Translumo Advanced real-time screen translator for games, hardcoded subtitles in videos, static text and etc. 项目地址: https://gitcode.com/gh_mirrors/tr/Translumo…...

tao-8k嵌入模型实测:Xinference免配置部署,长文本处理效率翻倍

tao-8k嵌入模型实测&#xff1a;Xinference免配置部署&#xff0c;长文本处理效率翻倍 1. 引言&#xff1a;长文本嵌入的工程挑战 在自然语言处理领域&#xff0c;文本嵌入模型扮演着至关重要的角色。它们将文本转换为高维向量表示&#xff0c;为语义搜索、文档聚类、问答系统…...