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

news2024/11/26 8:54:10

四、桥接模式

桥接模式(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 = color

    def 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.coloradmin.cn/o/718659.html

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

相关文章

合理组织安卓活动

本文所有代码均存放于https://github.com/MADMAX110/Starbuzz 开始构建一个应用时,你会考虑这个应用要包含什么,会有各种各样的很多想法,如何组织这些想法来建立一个直观、清晰的应用。 一、活动归类 要组织各种各样的活动,有一种…

IMX6ULL移植篇-uboot网络配置工作

一. uboot 网络IP配置 1. 硬件连接 在使用 uboot 的网络功能之前先用网线将开发板的 ENET2 接口和电脑或者路由器连接, I.MX6U-ALPHA 开发板有两个网口: ENET1 和 ENET2 ,一定要连接 ENET2 ,ENET2 接口如下&#xff1a…

LIS系统源码 基于互联网技术的医院实验室信息管理系统源码

LIS系统,即实验室信息管理系统,是一种基于互联网技术的医疗行业管理系统,它可以帮助实验室进行样本管理、检测流程管理、结果报告等一系列工作,提高实验室工作效率和质量。下面将从LIS系统的功能、特点方面对其进行详细介绍。 一、…

基于深度学习的高精度工人安全帽检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要:基于深度学习的高精度工人安全帽检测识别系统可用于日常生活中或野外来检测与定位工人安全帽目标,利用深度学习算法可实现图片、视频、摄像头等方式的工人安全帽目标检测识别,另外支持结果可视化与图片或视频检测结果的导出。本系统采用…

docker-compose管理mongo

mongo-express 可以线上管理mongo 库,下面记录一下docker-compose 配置 mongo以及mongo-express version: "3.1"services:mongo:image: mongorestart: alwaysports:- 27017:27017environment:- MONGO_INITDB_ROOT_USERNAMEadmin- MONGO_INITDB_ROOT_PASSW…

【花雕】全国青少年机器人技术一级考试备考实操搭建手册5

目录 1、秋千 2、跷跷板 3、搅拌器 4、奇怪的钟 5、起重机 6、烤肉架 7、手摇风扇 8、履带车 9、直升机 10、后轮驱动车 起重机是指在一定范围内垂直提升和水平搬运重物的多动作起重机械。又称天车,航吊,吊车。 轮胎起重机的主要特点是:其行…

CTFHub XSS DOM跳转 WriteUp

前文&#xff1a;DOM反射XSS 进入网站&#xff0c;直接查看源代码&#xff0c;下面是关键代码&#xff0c;这里有xss漏洞&#xff1a; <script>var target location.search.split("")if (target[0].slice(1) "jumpto") {location.href target[1…

深度解读AIGC存储解决方案

5月26日&#xff0c;2023数据基础设施技术峰会在苏州举办&#xff0c;腾讯云首席存储技术专家温涛受邀出席并分享了腾讯云领先的存储技术在AIGC场景中的应用&#xff0c;通过对AIGC业务流程和场景的提炼&#xff0c;从内容生成、内容审核和内容智理三要素介绍了如何智能的存储和…

你可以对AI中台有所了解

一个AI中台覆盖从数据管理、数据标注、模型开发、部署上线到运营管理的AI能力研发与应用全生命周期建设和管理。作为企业AI能力的生产、应用和集中化管理平台&#xff0c;AI中台包括智能数据、模型开发、模型中心、预测服务、AI集市和平台管理等部分。 智能数据&#xff1a;提供…

基于JavaSpringBoot+Vue+uniapp微信小程序实现鲜花商城购物系统

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

归并排序 与 逆序对数量

一、归并排序 题目&#xff1a; 给定你一个长度为 n 的整数数列&#xff0c;请你使用归并排序对这个数列按照从小到大进行排序&#xff0c;并将排好序的数列按顺序输出。 输入格式&#xff1a; 输入共两行&#xff0c;第一行包含整数 n。 第二行包含 n个整数&#xff08;所有整…

Kubernetes(k8s)入门:核心组件详解

文章目录 写在前面一、ReplicationController(RC)1、官方解释2、举个例子3、小总结 二、ReplicaSet(RS)1、官方解释2、举个例子 三、Deployment&#xff08;用的最多&#xff09;1、官方解释2、举个例子&#xff08;1&#xff09;创建nginx_deployment.yaml文件&#xff08;2&a…

MySQL学习基础篇(七)---单行函数

MySQL学习基础篇(七)—单行函数 1 什么是函数 函数在计算机语言的使用中贯穿始终&#xff0c;函数的作用是什么呢&#xff1f;它可以把我们经常使用的代码封装起来&#xff0c;需要的时候直接调用即可。这样既 提高了代码效率 &#xff0c;又 提高了可维护性 。在 SQL 中我们…

学习笔记整理-UML建模与应用复习4-构架建模

在一个更高的层次描述一个应用系统的结构&#xff0c;包括系统组件和组件之间的关系&#xff0c;组件的部署情况&#xff0c;以及硬件设备之间的关系。 1、组件图 用于描述功能所在的组件位置以及它们之间的关系。 包括&#xff1a;组件、接口、以及各种关系。可以显示…

IAR中Zstack协议栈相关问题解决办法

IAR中Zstack协议栈相关问题解决办法 1、Warning[w52]: More than one definition for the byte at address 0x4b in common segment INTVEC. 如果遇到类似 Warning[w52]: More than one definition for the byte at address 0x4b in common segment INTVEC. It is defined i…

uniapp打包之配置MacOS虚拟机生成iOS打包证书

前言 uniapp是一款跨端开发框架,可用于快速开发iOS、Android、H5等多端应用。本文将详细介绍如何实现uniapp开发的iOS应用打包。 详细步骤 一、下载苹果原版镜像文件 点击此处下载 二、安装VMware uniapp打包iOS应用需要生成相应证书和P2文件&#xff0c;这些都需要用到I…

android ChkBugReport 的安装

参考地址: https://github.com/sonyxperiadev/ChkBugReport/wiki/How-to-install-it 1:先下载下来 git clone https://github.com/sonyxperiadev/ChkBugReport.git 然后在把这两个下载下来 http://sonyxperiadev.github.io/ChkBugReport/download/chkbugreport (Launcher sh…

前台-打印

插件 jsbarcode、uuid、vue-easy-print、vue-qr 主页面 <script setup lang"ts">import { ref } from vueimport PrintUser from ./printUser.vueconst easyPrint ref()const printDemo () > {setTimeout(() > {easyPrint.value.print()}, 1000)}…

kotlin constructor init companion object 与初始化by lazy

kotlin constructor init companion object 与初始化by lazy class MyDemo(private var v: Int) {init {println("init $v")}constructor(m: Int, n: Int) : this(m) {println("constructor $m $n")}//只初始化一次companion object {private var TAG &qu…

spring工程的启动流程?bean的生命周期?提供哪些扩展点?管理事务?解决循环依赖问题的?事务传播行为有哪些?

1.Spring工程的启动流程&#xff1a; Spring工程的启动流程主要包括以下几个步骤&#xff1a; 加载配置文件&#xff1a;Spring会读取配置文件&#xff08;如XML配置文件或注解配置&#xff09;来获取应用程序的配置信息。实例化并初始化IoC容器&#xff1a;Spring会创建并初…