中国建设企业银行官网站,重庆专业建网站,网站做得好的公司,龙岩网站推广公司Python 中的桥接模式#xff08;Bridge Pattern#xff09;
桥接模式是一种结构型设计模式#xff0c;其核心目的是#xff1a; 将抽象部分#xff08;Abstraction#xff09;与实现部分#xff08;Implementation#xff09;分离#xff0c;使它们可以独立变化。
形…Python 中的桥接模式Bridge Pattern桥接模式是一种结构型设计模式其核心目的是将抽象部分Abstraction与实现部分Implementation分离使它们可以独立变化。形象比喻就像一座桥连接两岸——“抽象”和“实现”本来紧密耦合通过桥接模式把它们分开让两岸各自发展而不互相影响。为什么需要桥接模式如果不使用桥接模式当抽象和实现都有多个变体时会产生类爆炸Cartesian product例如形状圆、正方形 × 渲染方式矢量、光栅 → 需要 2 × 2 4 个类如果再加一种形状或一种渲染方式就需要新增更多类。桥接模式通过组合而不是继承来解决这个问题。典型应用场景GUI 框架窗口抽象 vs 不同平台实现Windows、Mac、Linux绘图程序形状抽象 vs 渲染器矢量、像素、光追驱动程序设备抽象 vs 不同协议实现消息发送消息类型文本、图片 vs 发送渠道邮件、短信、推送Python 实现示例形状 渲染器fromabcimportABC,abstractmethod# 实现部分ImplementationclassRenderer(ABC):abstractmethoddefrender_circle(self,radius:float):passabstractmethoddefrender_square(self,side:float):pass# 具体实现1矢量渲染classVectorRenderer(Renderer):defrender_circle(self,radius:float):print(f矢量渲染绘制半径为{radius}的圆)defrender_square(self,side:float):print(f矢量渲染绘制边长为{side}的正方形)# 具体实现2光栅渲染像素classRasterRenderer(Renderer):defrender_circle(self,radius:float):print(f光栅渲染绘制半径为{radius}的圆像素点)defrender_square(self,side:float):print(f光栅渲染绘制边长为{side}的正方形像素填充)# 抽象部分AbstractionclassShape(ABC):def__init__(self,renderer:Renderer):self.rendererrenderer# 通过组合持有实现abstractmethoddefdraw(self):passabstractmethoddefresize(self,factor:float):pass# 细化抽象圆classCircle(Shape):def__init__(self,renderer:Renderer,radius:float):super().__init__(renderer)self.radiusradiusdefdraw(self):self.renderer.render_circle(self.radius)defresize(self,factor:float):self.radius*factorprint(f圆形调整大小新半径{self.radius})# 细化抽象正方形classSquare(Shape):def__init__(self,renderer:Renderer,side:float):super().__init__(renderer)self.sidesidedefdraw(self):self.renderer.render_square(self.side)defresize(self,factor:float):self.side*factorprint(f正方形调整大小新边长{self.side})# 客户端使用if__name____main__:# 可以自由组合抽象和实现vectorVectorRenderer()rasterRasterRenderer()circle1Circle(vector,5)circle1.draw()# 矢量圆circle1.resize(2)circle1.draw()circle2Circle(raster,10)circle2.draw()# 光栅圆squareSquare(vector,4)square.draw()# 切换渲染器非常容易another_circleCircle(raster,3)another_circle.draw()输出矢量渲染绘制半径为 5 的圆 圆形调整大小新半径 10.0 矢量渲染绘制半径为 10.0 的圆 光栅渲染绘制半径为 10 的圆像素点 矢量渲染绘制边长为 4 的正方形 光栅渲染绘制半径为 3 的圆像素点现在新增一种形状如 Triangle只需继承 Shape新增一种渲染器如 OpenGLRenderer只需实现 Renderer 接口无需修改现有代码。桥接模式结构总结角色说明Abstraction抽象类Shape持有 Implementation 引用RefinedAbstraction细化抽象Circle、SquareImplementor实现接口RendererConcreteImplementor具体实现VectorRenderer、RasterRenderer桥接模式 vs 其他模式对比模式目的组合 vs 继承典型场景桥接分离抽象与实现独立变化组合多维度变化如平台功能适配器接口转换组合整合不兼容接口策略算法可替换组合行为变化装饰器动态添加职责组合功能增强Python 中的实用建议Python 是动态语言桥接模式实现非常自然通过组合注入实现。常与依赖注入结合使用。在 GUI、游戏引擎、跨平台库中非常常见如 PyQt/PySide 的后台实现。不要与继承混用过度——桥接强调“组合优于继承”。更现实的例子消息发送系统classMessageSender(ABC):abstractmethoddefsend(self,message:str):passclassEmailSender(MessageSender):defsend(self,message:str):print(f通过 Email 发送:{message})classSMSSender(MessageSender):defsend(self,message:str):print(f通过 SMS 发送:{message})classMessage(ABC):def__init__(self,sender:MessageSender):self.sendersenderabstractmethoddefprepare(self)-str:passdefsend_message(self):contentself.prepare()self.sender.send(content)classTextMessage(Message):def__init__(self,sender,text):super().__init__(sender)self.texttextdefprepare(self):returnf文本消息:{self.text}classUrgentMessage(Message):defprepare(self):returnf【紧急】{self.text.upper()}!!!# 使用自由组合email_textTextMessage(EmailSender(),会议通知)email_text.send_message()sms_urgentUrgentMessage(SMSSender(),火警警报)sms_urgent.send_message()桥接模式是处理多维度变化的强大工具在大型系统设计中非常有用。如果你想看更复杂的例子如 GUI 跨平台桥接、数据库驱动桥接或者与其他模式如抽象工厂结合使用欢迎继续问