设计模式-结构型-桥接模式

1. 什么是桥接模式?

桥接模式(Bridge Pattern) 是一种结构型设计模式,它旨在将抽象部分与实现部分分离,使它们可以独立变化。通过这种方式,系统可以在抽象和实现两方面进行扩展,而无需相互影响。

核心思想

桥接模式的核心思想是将抽象实现解耦,使得它们可以独立扩展。它通过引入一个“桥接接口”,在抽象层和实现层之间建立一个桥梁。

适用场景

桥接模式适用于以下场景:

  1. 需要在两个维度上扩展:比如图形与颜色、设备与操作系统等。
  2. 避免类的数量爆炸:当类的组合维度过多时,使用桥接模式可以避免创建大量的子类。
  3. 希望实现抽象和具体实现分离:提高系统的灵活性和可维护性。

2. 桥接模式的结构

UML 类图

图像来源

核心角色

  1. Abstraction(抽象类)
    定义抽象部分的接口,包含一个指向实现部分 Implementor 的引用。

  2. RefinedAbstraction(扩充抽象类)
    继承自 Abstraction,扩展其功能。

  3. Implementor(实现接口)
    定义实现部分的接口,通常为抽象接口,供具体实现类实现。

  4. ConcreteImplementor(具体实现类)
    实现 Implementor 接口,完成具体操作。


3. 桥接模式的示例

场景描述

假设我们需要设计一个绘图系统,支持不同类型的形状(如圆形和矩形)以及不同颜色的渲染方式(如红色和蓝色)。如果直接使用继承,可能需要创建大量子类(如红色圆形、蓝色矩形等),桥接模式可以优雅地解决这个问题。

代码实现

# 实现部分:定义颜色
class Color:def apply_color(self):passclass RedColor(Color):def apply_color(self):return "Red"class BlueColor(Color):def apply_color(self):return "Blue"# 抽象部分:定义形状
class Shape:def __init__(self, color: Color):self.color = colordef draw(self):passclass Circle(Shape):def __init__(self, color: Color, radius: int):super().__init__(color)self.radius = radiusdef draw(self):return f"Drawing Circle of radius {self.radius} with color {self.color.apply_color()}"class Rectangle(Shape):def __init__(self, color: Color, width: int, height: int):super().__init__(color)self.width = widthself.height = heightdef draw(self):return f"Drawing Rectangle of width {self.width} and height {self.height} with color {self.color.apply_color()}"# 测试桥接模式
if __name__ == "__main__":# 创建颜色实例red = RedColor()blue = BlueColor()# 创建形状实例red_circle = Circle(red, 10)blue_rectangle = Rectangle(blue, 20, 15)print(red_circle.draw())      # 输出:Drawing Circle of radius 10 with color Redprint(blue_rectangle.draw()) # 输出:Drawing Rectangle of width 20 and height 15 with color Blue

4. 桥接模式的优缺点

优点

  1. 解耦抽象和实现
    抽象部分与实现部分可以独立变化,增强系统的灵活性。

  2. 提高可扩展性
    可以轻松增加新的抽象部分或实现部分,而无需修改已有代码。

  3. 符合开闭原则
    新增功能时,只需扩展新的类,而不需要修改现有代码。

  4. 减少类的数量
    避免了多维度继承导致的类爆炸问题。

缺点

  1. 复杂性增加
    系统需要引入额外的桥接接口和实现层,增加了代码的复杂性。

  2. 过度设计
    对于简单需求可能显得冗余,不如直接使用继承。


5. 桥接模式的应用场景

现实应用

  1. 图形绘制系统
    如上述示例中的形状与颜色的组合。

  2. 跨平台应用
    一个程序需要适配不同平台时,抽象部分定义通用接口,具体实现部分针对各个平台实现。

  3. 数据库访问
    抽象部分定义通用的数据操作接口,具体实现部分可以是 MySQL、PostgreSQL、MongoDB 等不同数据库的操作实现。

  4. 日志框架
    日志内容与日志存储方式分离,方便扩展。


6. 总结

桥接模式通过将抽象与实现分离,使得系统的两个维度可以独立扩展。这种模式在需要跨维度组合的场景中尤为适用。通过桥接模式,我们可以有效地降低代码的耦合度,提高系统的灵活性和可维护性。

核心要点

  1. 抽象部分与实现部分分离
  2. 避免多维度继承引发的类爆炸问题
  3. 灵活扩展,符合开闭原则

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

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

相关文章

Linux 虚拟机与windows主机之间的文件传输--设置共享文件夹方式

Linux 虚拟机与windows主机之间的文件传输 设置共享文件夹方式 在虚拟机中打开终端查看是否已经新建完成,到文件夹中找到它看一下,这个位置就能存储东西啦

关于linux网桥(Linux Bridge)的一些个人记录

文章目录 1. Linux Bridge简述2. 网桥创建创建配置持久化在Debian/Ubuntu系统上:在CentOS/RHEL系统上: 启用和验证 3. 关于linux网桥不转发ip帧的问题原因解决配置持久化 4. 查看网桥学习交换表手动添加或删除条目添加条目删除条目 配置静态条目设置条目…

期末概率论总结提纲(仅适用于本校,看文中说明)

文章目录 说明A选择题1.硬币2.两个事件的关系 与或非3.概率和为14.概率密度 均匀分布5.联合分布率求未知参数6.联合分布率求未知参数7.什么是统计量(记忆即可)8.矩估计量9.117页12题10.显著水平阿尔法(背公式就完了) 判断题11.事件…

Inno Setup制作安装包,安装给win加环境变量

加 ; 加环境变量,开启,下面一行 ChangesEnvironmentyes 和 ; 加环境变量wbrj变量名,{app}\project\bin变量值,{app}\后接文件名,{app}表示安装路径。下面一行,{olddata};原来的值上拼接 Root: HKLM; Subkey: “SYSTEM\…

Golang学习笔记_23——error补充

Golang学习笔记_20——error Golang学习笔记_21——Reader Golang学习笔记_22——Reader示例 文章目录 error补充1. 基本错误处理2. 自定义错误3. 错误类型判断3.1 类型断言3.2 类型选择 4. panic && recover 源码 error补充 1. 基本错误处理 在Go中,函数…

Python中的asyncio:高效的异步编程模型

随着互联网应用的快速发展,程序的响应性和处理效率成为衡量系统性能的重要指标。传统的同步编程模型在面对高并发和IO密集型任务时,常常显得捉襟见肘,难以满足现代应用的需求。Python的asyncio库作为一种高效的异步编程模型,为开发…

JavaScript -- 数组详解(使用频率高)【数组专题】

文章目录 前言一、创建数组1.1 使用Array构造函数1.2 使用数组字面量表示法1.3 ES6语法转换数组1.3.1 from( )用于将类数组结构转换为数组实例1.3.2 of( )用于将一组参数转换为数组实例 二、数组常用方法2.1 复制和填充2.1.1 copyWithin( )2.1.2 fill( ) 2.2 数组转换2.2.1 toS…

操作系统之文件系统的基本概念

目录 用户和磁盘视角的文件 文件控制块(FCB)和索引结点(inode) 文件的操作 创建文件(create系统调用) 写文件(write系统调用) 读文件(read系统调用) 重…

如何制作一份出色的公司介绍PPT?

制作一份公司介绍的PPT需要精心设计,以确保内容既专业又吸引人。以下是一个基本的框架和一些建议,帮助您创建一份有效的公司介绍PPT: PPT标题页 标题:公司全称(可使用公司Logo作为背景或嵌入标题中)副标题…

springboot项目部署至linux

1.修改pom.xml 确认是否有以下代码&#xff0c;没有请进行添加&#xff0c;mainClass改成你的启动类 <plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.ve…

vue.js 使用router-link替代a标签实现高亮

在Vue.js中&#xff0c;可以使用<router-link>组件来替代<a>标签实现高亮效果。<router-link>是Vue-Router提供的组件&#xff0c;用于路由导航。 首先&#xff0c;需要在Vue项目中安装Vue-Router。可以使用以下命令安装&#xff1a; npm install vue-rout…

FPGA随记——时钟时序一些基本知识

原文链接&#xff1a;跨时钟域设计-CSDN博客 前言 CDC&#xff08;clock domain crossing&#xff09;检查&#xff08;跨时钟域的检查&#xff09;是对电路设计中同步电路设计的检查。非同步时钟没有固定的相位关系&#xff0c;这样Setup/Hold不满足而产生了亚稳态是无法避免…

实例解析网络钓鱼攻击的幕后

网络钓鱼是通过大量发送声称来自于银行或其他知名机构的欺骗性垃圾邮件&#xff0c;意图引诱收信人给出敏感信息&#xff08;如用户名、口令、帐号ID、ATM PIN码或信用卡详细信息&#xff09;的一种攻击方式。最典型的网络钓鱼攻击将收信人引诱到一个通过精心设计与目标组织的网…

STM32+WIFI获取网络时间+8位数码管显示+0.96OLED显

资料下载地址&#xff1a;STM32WIFI获取网络时间8位数码管显示0.96OLED 1、项目介绍 主控芯片STM32C8T6 接线&#xff1a;串口1&#xff1a;PA9 PA10 OELD &#xff1a;PB6 PB7 数码管使用&#xff1a;MAX7219 8位数码管 Max7219_pinCLK PAout(5) Max7219_pinC…

1688平台商品关键词搜索的多样性与Python爬虫应用实践

在当今这个信息化、数字化飞速发展的时代&#xff0c;电子商务平台已经成为人们日常生活中不可或缺的一部分。而1688作为国内知名的B2B电商平台&#xff0c;凭借其庞大的商品种类和丰富的供应链资源&#xff0c;为无数商家和消费者提供了便捷的交易渠道。除了广受关注的女装品类…

记录将springboot的jar包和lib分离,使用docker-compose部署

本文讲诉如何把jar里的lib依赖包独立出来&#xff0c;方便更新服务时&#xff0c;缩小jar的体积&#xff0c;下面以若依的system服务为例&#xff0c;配置中的路径请酌情修改&#xff0c;主要提供大致配置逻辑 第一步&#xff1a;修改项目的pom.xml&#xff0c;调整build的配…

如何解决Redis中的热点key问题

Redis中的热点Key问题是指某些特定的Key被频繁访问&#xff0c;导致Redis中某个节点&#xff08;或实例&#xff09;承担过高的压力&#xff0c;可能引发性能瓶颈&#xff0c;甚至若缓存承受不住服务压力挂掉后&#xff0c;仍有大量请求时直接打到DB上&#xff0c;由于DB层相对…

单片机实现模式转换

[任务] 要求通过单片机实现以下功能&#xff1a; 1.单片机有三种工作模式(定义全局变量MM表示模式&#xff0c;MM1&#xff0c;2&#xff0c;3表示三种不同的模式) LED控制模式 风扇控制模式 蜂鸣器控制模式 2.可以在某一个模式下通过拓展板KEY1按键控制设备 (按…

安卓OCR使用(Google ML Kit)

OCR是一个很常用的功能&#xff0c;Google ML Kit提供了OCR能力&#xff0c;用起来也很简单&#xff0c;本文介绍一下使用方法。 1. 相关概念 名词概念解释TextBlock块一个段落Line行一行文本Element元素单词&#xff1b;对汉字来说&#xff0c;类似"开头 (分隔符)中间&…

数据库(3)--针对列的CRUD操作

1.Create 新增 语法&#xff1a; insert into 表名 &#xff08;列名&#xff09;values &#xff08;列&#xff09;... 创建一个学生表用于演示&#xff1a; create table if not exists student( id bigint comment 编号, name varchar(20) comment 姓名 ); 1.1直接增加…