软件设计模式与体系结构-设计模式-结构型软件设计模式-桥接模式

四、桥接模式

桥接模式(Bridge Pattern)是一种软件设计模式,它用于将抽象部分与其具体实现部分解耦,使它们可以独立地变化。桥接模式的核心思想是将一个系统分为多个维度,并通过桥接连接这些维度,从而实现更灵活的系统设计。

在桥接模式中,有两个主要的角色:

  1. 抽象部分(Abstraction):抽象部分定义了系统的高层接口,它包含了抽象方法和引用实现部分的对象。抽象部分通过委派调用实现部分的对象来完成具体的操作。

  2. 实现部分(Implementor):实现部分定义了抽象部分的具体实现,它提供了具体方法的实现细节。实现部分通常是一个接口或抽象类,它定义了可以由具体实现类来实现的方法。

通过桥接模式,可以实现抽象部分和实现部分的分离,使它们可以独立地变化。这样,在系统需要扩展或修改时,可以在不影响其他部分的情况下对其进行修改。

使用桥接模式的好处包括:

  • 解耦:将抽象部分和实现部分分离,使它们可以独立地变化。
  • 扩展性:容易添加新的抽象部分和实现部分,扩展系统的功能。
  • 可维护性:修改抽象部分或实现部分的代码不会对另一部分产生影响,易于维护。

总之,桥接模式通过将抽象部分和实现部分解耦,提供了一种灵活的设计方式,使系统更加可扩展和可维护。它在许多领域中都有广泛的应用,特别是在需要处理多维度变化的情况下,可以帮助构建更具弹性和可扩展性的软件系统。

概念

对于有两个变化维度(即两个变化的原因)的系统,采用方案2来进行设计系统中类的个数更少,且系统扩展更为方便。

桥接模式将继承关系转换为关联关系,从而降低了类与类之间的耦合,减少了代码编写量

桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立地变化
它是一种对象结构型模式,又称为柄体模式或接口模式
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码

以下是一个简单的桥接模式的代码示例,展示了如何使用桥接模式来实现一个形状(Shape)和颜色(Color)之间的桥接关系:

# 实现部分接口
class Color:def fill(self):pass# 具体实现部分类
class RedColor(Color):def fill(self):return "填充红色"class BlueColor(Color):def fill(self):return "填充蓝色"# 抽象部分接口
class Shape:def __init__(self, color):self.color = colordef draw(self):pass# 具体抽象部分类
class SquareShape(Shape):def draw(self):return f"绘制正方形,{self.color.fill()}"class CircleShape(Shape):def draw(self):return f"绘制圆形,{self.color.fill()}"# 使用桥接模式
red_color = RedColor()
blue_color = BlueColor()square_shape = SquareShape(red_color)
print(square_shape.draw())  # 输出:绘制正方形,填充红色circle_shape = CircleShape(blue_color)
print(circle_shape.draw())  # 输出:绘制圆形,填充蓝色

在上面的示例中,Color 是实现部分接口,RedColorBlueColor 是具体实现部分类。Shape 是抽象部分接口,SquareShapeCircleShape 是具体抽象部分类。

通过在抽象部分中包含一个实现部分的对象,将抽象部分和实现部分连接起来。在创建具体抽象部分类的实例时,需要传入一个具体实现部分类的实例作为参数。

通过调用抽象部分的方法,并委托给实现部分的对象来完成具体的操作。这样,在不改变抽象部分和实现部分的代码的情况下,可以通过更换具体实现部分类的实例,来改变系统的行为。

在上述示例中,SquareShapeCircleShape 分别绘制正方形和圆形,并通过 color.fill() 调用委托给具体实现部分类的 fill() 方法来填充颜色。

这个示例展示了桥接模式的基本思想和结构,它通过将抽象部分和实现部分解耦,使得它们可以独立地变化和扩展。通过桥接模式,可以更灵活地设计和组织系统,使得系统具有更好的可扩展性和可维护性。

实例一:自动茶水销售机

在这里插入图片描述
在这里插入图片描述

实例二:不同度量的体积计算问题

在这里插入图片描述

实例三:跨平台视频播放器

在这里插入图片描述
在这里插入图片描述

优缺点

优点:
满足开闭原则

  1. 分离抽象接口及其实现部分
  2. 桥接模式有时类似于多继承方案,但是多继承方案违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差,而且多继承结构中类的个数非常庞大,桥接模式是比多继承方案更好的解决方法
  3. 桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统
  4. 实现细节对客户透明,可以对用户隐藏实现细节

缺点:

  1. 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程
  2. 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性

使用环境

  1. 需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系
  2. 抽象化角色和实现化角色可以以继承的方式独立扩展而互不影响
  3. 存在两个独立变化的维度
  4. 不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统

关于桥接模式的讨论

适配器模式与桥接模式的联用

桥接模式用于系统的初步设计,当发现系统与已有类无法协同工作时,可以采用适配器模式

课程作业

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

行为型软件设计模式

概述

动机

行为型软件设计模式关心算法和对象之间的责任分配,不仅是描述对象或类模式,更加侧重描述它们之间的通信模式

内容

迭代器模式抽象了访问和遍历一个集合中的对象的方式
访问者模式封装了分布于多个类之间的行为
中介者模式通过在对象间引入一个中介对象,避免对象间的显式引用
策略模式将算法封装在对象中,这样可以方便指定或改变一个对象使用的算法
状态模式封装了兑现过的状态,使得当对象的状态发生变化时,该对象可以改变自身的行为

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

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

相关文章

登录远程Linux桌面

远程桌面连接主要使用两种协议,一种是Windows上RDP协议,第二种是VNC协议,从使用效果来看,vnc更优秀。 一、VNC 使用x11vnc 1.安装x11vnc sudo apt install x11vnc 2.启动x11vnc x11vnc -passwd orangepi -display :0 -forever…

linux 时间同步 chrony

Chrony介绍 chrony 是基于NPT协议的实现时间同步服务,它既可以当做服务端,也可以充当客户端。chrony是ntp的代替品,能更精确的时间和更快的速度同步时钟,chrony 占用系统资源少,只有被唤起时才占用少部分CPU&#xff0…

云原生|kubernetes|centos7下离线化部署kubesphere-3.3.2---基于kubernetes-1.22.16(从网络插件开始记录)

前言: kubesphere的离线化部署指的是通过自己搭建的harbor私有仓库拉取镜像,完全不依赖于外部网络的方式部署。 我的kubernetes集群是一个单master节点,双工作节点,总计三个节点的版本为1.22.16的集群。 该集群只是初始化完成了…

详解DNS协议!

前言 想要不同的计算机之间进行通信,是需要知道对方的IP的,可是为什么我们平时很少用到ip,而是用到域名这种东西呢? 其实主要是为了方便阅读,让我们记住一串的ip还不如记域名来的方便。 当我们访问域名的时候&#xf…

C 学习笔记1-基础语法合集

C 基础语法 文章目录 C 基础语法注意 C 其他知识点编译过程编译器数据模型区别32/64位机器中,各数据类型所占位数assert() 断言(宏)用法总结与注意事项 C 函数printf()putchar()sizeof() C 位域位域声明位域的定义和位域变量的说明位域的使用…

微信小程序实现抖音视频效果

当我们进行开发的时候可能会遇到需要实现抖音视频效果的需求,并且网上该效果的开源代码少,找到的开源代码代码量大,很难进行二次开发 对此我将自己的代码进行简化,仅留下可动性高的代码模块 以上是实现效果与此处demo的模板 wx…

window debug ios webview

业务需求 在window上想要debug在ios的应用中的webview页面,毕竟页面是在安卓端和ios端都有webview的。安卓的页面使用edge的edge://inspect/#devices,手机开启调试模式就可以了。对于ios就没有办法,页面中已经使用了vconsole可以看到部分的信…

PLC与工业机器人

PLC和工业机器人是在工业自动化领域中常用的技术。它们在不同的应用场景中具有不同的优势和用途。 PLC是一种用于控制和监控生产过程的计算机控制系统。它具有可编程性和灵活性,能够适应不同的控制需求。PLC通常用于控制生产线、工厂设备以及自动化工艺&#xff0c…

上门家政小程序|上门保洁APP|家政服务预约上门软件开发

上门家政小程序对于上门保洁服务非常方便。下面是一些简单介绍:   预约便捷:通过上门家政小程序,用户可以随时随地进行保洁服务的预约。无论是在家中、办公室还是旅途中,用户只需打开小程序,选择合适的日期和时间&am…

docker专题系列之十六:安装mycat

由于docker镜像仓库中mycat镜像比较少或相对比较旧,因此一般使用手动制作镜像方式安装部署。下文,良哥通过实验,分别介绍两种方式下如何安装部署mycat。 一、手动制作镜像方式 1.创建镜像 #创建工作目录 mkdir /usr/rdc mkdir /usr/rdc/my…

时间字符串转Date类型

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

使用Prometheus+Grafana实现监控

使用PrometheusGrafana实现监控 我们用 actuator 暴露应用本身的线程、bean 等信息,但是这些信息还是独立于 Prometheus 之外的。下面我们 将介绍如何将 SpringBoot Actuator 与 Prometheus 结合起来。 我们同样从 Spring Initializr 创建一个名为 spring-web-pr…