设计模式之-桥梁模式,快速掌握桥梁模式,通俗易懂的讲解桥梁模式以及它的使用场景

文章目录

  • 一、快速掌握桥梁模式
  • 二、使用场景
  • 三、代码示例
  • 五、 桥梁模式的优点包括:
  • 听一个故事来讲解桥梁模式,加深理解


一、快速掌握桥梁模式

设计模式中的桥梁模式(Bridge Pattern)是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立地变化。桥梁模式的核心思想是通过组合而不是继承来实现不同维度的变化。

通俗地说,桥梁模式就像是一座桥,将两个不同的维度连接在一起。其中,一个维度是抽象部分(Abstraction),它定义了高层业务逻辑,并包含对实现部分的引用;另一个维度是实现部分(Implementation),它定义了底层实现的接口。

通过桥梁模式,我们可以在两个维度上独立地变化和扩展,而不会相互影响。这种解耦的设计使得系统更加灵活,易于维护和扩展。

二、使用场景

  1. 当一个类存在两个独立变化的维度时,使用桥梁模式可以将这两个维度进行解耦,使得它们可以独立地变化。
  2. 当需要在多个对象间共享实现时,使用桥梁模式可以减少子类的数量,提高系统的可扩展性。
  3. 当一个类需要在运行时切换不同的实现时,桥梁模式可以实现运行时的动态切换。

三、代码示例

下面是一个简单的示例代码来说明桥梁模式的应用:

// 实现部分接口
interface DrawingAPI {void drawCircle(double x, double y, double radius);
}// 具体的实现部分
class DrawingAPI1 implements DrawingAPI {@Overridepublic void drawCircle(double x, double y, double radius) {System.out.printf("API1.drawCircle at (%.2f, %.2f) with radius %.2f%n", x, y, radius);}
}// 具体的实现部分
class DrawingAPI2 implements DrawingAPI {@Overridepublic void drawCircle(double x, double y, double radius) {System.out.printf("API2.drawCircle at (%.2f, %.2f) with radius %.2f%n", x, y, radius);}
}// 抽象部分
abstract class Shape {protected DrawingAPI drawingAPI;protected Shape(DrawingAPI drawingAPI) {this.drawingAPI = drawingAPI;}public abstract void draw();
}// 具体的抽象部分
class CircleShape extends Shape {private double x, y, radius;public CircleShape(double x, double y, double radius, DrawingAPI drawingAPI) {super(drawingAPI);this.x = x;this.y = y;this.radius = radius;}@Overridepublic void draw() {drawingAPI.drawCircle(x, y, radius);}
}public class BridgePatternExample {public static void main(String[] args) {Shape redCircle = new CircleShape(100, 100, 10, new DrawingAPI1());Shape greenCircle = new CircleShape(200, 200, 20, new DrawingAPI2());redCircle.draw();greenCircle.draw();}
}

在上述示例中,我们使用桥梁模式实现了一个简单的图形绘制系统。DrawingAPI接口定义了绘制图形的方法,有两个具体的实现类DrawingAPI1和DrawingAPI2。Shape是抽象部分的基类,它包含了对实现部分的引用,并定义了抽象的绘制方法draw()。CircleShape继承了Shape,并通过构造函数将实现部分的对象传递进去。最后,在main方法中创建了两个具体的图形对象,并调用它们的draw()方法来绘制图形。

五、 桥梁模式的优点包括:

  1. 解耦性高:桥梁模式将抽象部分和实现部分分离,使它们可以独立地变化。这样一来,对于抽象部分的修改不会影响到实现部分,反之亦然。这种解耦性可以提高系统的灵活性和可维护性。
  2. 扩展性强:通过桥梁模式,我们可以在两个维度上独立地扩展和变化。增加新的抽象部分或实现部分都相对容易,而且它们可以在运行时动态地组合和切换。
  3. 提高可复用性:由于抽象部分和实现部分可以独立地变化,可以更灵活地组合它们,从而提高代码的可复用性。

桥梁模式的缺点包括:

  1. 增加了系统的复杂性:桥梁模式需要额外的抽象和实现类,并引入了额外的接口和关联关系,这可能增加系统的复杂性。
  2. 增加了代码量:相比直接继承实现类的方式,桥梁模式需要编写更多的代码,包括抽象部分和实现部分的类以及它们之间的关系。

总的来说,桥梁模式适用于存在多个独立变化维度的情况,或者需要在运行时切换不同实现的情况。它可以帮助我们实现更灵活、可扩展和可复用的系统设计。

听一个故事来讲解桥梁模式,加深理解

假设有一个小镇上有两座相距很远的桥,分别是一座木桥和一座石桥。这两座桥分别代表了抽象部分和实现部分。每天早上,人们都要从小镇的一侧过桥去另一侧工作。

某天,小镇的镇长决定要修建一座新的桥,以便提供更多的通行便利性。为了实现这个目标,他决定使用桥梁模式。

镇长找来一个桥梁设计师,设计师告诉镇长,他可以设计一座新桥的抽象部分,即桥的结构和功能,不管是木桥还是石桥都可以。设计师还告诉镇长,他可以与两个工程师合作,一个擅长建造木桥,另一个擅长建造石桥。这两个工程师代表了实现部分。

设计师设计了一个抽象的桥模型,包含了通行的功能。然后,他与木桥工程师和石桥工程师一起合作,让他们根据设计制造出具体的桥。木桥工程师根据抽象模型建造了一座木桥,石桥工程师根据同样的抽象模型建造了一座石桥。

完成后,镇长和设计师非常高兴。现在,无论是木桥还是石桥,都可以作为新桥的实现部分。人们可以根据需要选择在哪座桥上通行,而不受具体桥的类型影响。

这个故事中的小镇和桥就是一个典型的应用场景。小镇代表了整个系统,而抽象部分是桥的结构和功能,实现部分则是具体的木桥和石桥。设计师就是桥梁模式的核心,他将抽象部分和实现部分分离,并协调它们的工作。通过桥梁模式,小镇的系统变得更加灵活和可扩展,可以根据需要选择不同的实现部分。

代码示例:

// 实现部分接口
interface Bridge {void cross();
}// 具体的实现部分
class WoodenBridge implements Bridge {@Overridepublic void cross() {System.out.println("Crossing the wooden bridge.");}
}// 具体的实现部分
class StoneBridge implements Bridge {@Overridepublic void cross() {System.out.println("Crossing the stone bridge.");}
}// 抽象部分
abstract class Town {protected Bridge bridge;protected Town(Bridge bridge) {this.bridge = bridge;}public abstract void visit();
}// 具体的抽象部分
class MorningTown extends Town {public MorningTown(Bridge bridge) {super(bridge);}@Overridepublic void visit() {System.out.println("Visiting the town in the morning.");bridge.cross();}
}// 具体的抽象部分
class EveningTown extends Town {public EveningTown(Bridge bridge) {super(bridge);}@Overridepublic void visit() {System.out.println("Visiting the town in the evening.");bridge.cross();}
}public class BridgePatternExample {public static void main(String[] args) {Bridge woodenBridge = new WoodenBridge();Bridge stoneBridge = new StoneBridge();Town morningTown = new MorningTown(woodenBridge);Town eveningTown = new EveningTown(stoneBridge);morningTown.visit();eveningTown.visit();}
}

在上述示例代码中,我们使用桥梁模式实现了一个简单的小镇和桥的系统。Bridge接口定义了桥的通行方法,有两个具体的实现类WoodenBridge和StoneBridge,分别表示木桥和石桥。Town是抽象部分的基类,它包含了对桥实现部分的引用,并定义了抽象的访问方法visit()。MorningTown和EveningTown继承了Town,并通过构造函数将实现部分的对象传递进去。最后,在main方法中创建了具体的小镇和桥对象,并调用它们的visit()方法来模拟访问小镇。

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

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

相关文章

普中STM32-PZ6806L开发板(HAL库函数实现-TIM2实现us延时)

简介 使用TIM2实现1us延时其他知识 公式 时间(s)1/时钟频率(Hz)由导出 1us 1/1M(Hz)预分配设置 系统时钟是72MHz, 要1us的延时, 预分配得设置为72-1计数器重载设置 设置为最大值65535,这样延时的时间可以设置的最…

【Vue3】创建项目的方式

1. 基于 vue-cli 创建 ## 查看vue/cli版本,确保vue/cli版本在4.5.0以上 vue --version## 安装或者升级你的vue/cli npm install -g vue/cli## 执行创建命令 vue create vue_test本质上使用webpack,默认安装以下依赖: 2. 基于 vite 创建 官…

Buck电源设计常见的一些问题(五)MOS管振荡抑制方法(三)

MOS管振荡抑制方法(三)Rboot的选取 1.Rboot的选取2.总结1.Rboot的选取 同步 Buck 变换器一般采用自举电路供电,如图所示。开关节点上升沿的振荡与上管开通关系密切,上管开通时的驱动电流路径如图所示。因此,可以通过增大 Rboot来减缓上管开通的速度,从而抑制开关节点的振…

文献速递:人工智能医学影像分割---高效的MR引导CT网络训练,用于CT图像中前列腺分割

01 文献速递介绍 如今,根据国家癌症研究所的报告,美国约有9.9%的男性患有前列腺癌。1 此外,根据美国癌症协会的数据,预计2019年将有174,650个新病例被诊断出前列腺癌,与此同时大约有31,620名男性将死于前列腺癌。因此…

vue前端预览pdf并加水印、ofd文件,控制打印、下载、另存,vue-pdf的使用方法以及在开发中所踩过的坑合集

根据公司的实际项目需求,要求实现对pdf和ofd文件的预览,并且需要限制用户是否可以下载、打印、另存pdf、ofd文件,如果该用户可以打印、下载需要控制每个用户的下载次数以及可打印的次数。正常的预览pdf很简单,直接调用浏览器的预览…

计算机操作系统(OS)——P1操作系统概述

1、操作系统的概念(定义) 1.1、什么是操作系统 __操作系统(Operating System,OS):__是指控制和管理整个计算机系统的__硬件和软件__资源,并合理的组织调度计算机的工作和资源的分配;以__提供给用户和其它…

Java三层架构/耦合/IOC/DI

一.三层架构 controller/web 控制层。接收前端发送的请求,对请求进行处理,并响应数据。 service 业务逻辑层,处理具体的业务逻辑。 dao 数据访问层(Data Access Object),也称为持久层。负责数据访问操作,包括数据的增、…

矩阵理论基本知识

1、矩阵范数、算子范数 矩阵无穷范数是非自相容范数,矩阵1-范数、矩阵2-范数是自相容范数矩阵2-范数:Frobenius范数,是向量2-范数的自然推广。 ∥ A ∥ m 2 ∥ A ∥ F ∑ a i j ∗ a i j \|A\|_{m2}\|A\|_{F}\sqrt{\sum a_{ij}^*a_{ij}} ∥…

pytest实现多进程与多线程运行超好用的插件

前言 如果想分布式执行用例,用例设计必须遵循以下原则: 1、用例之间都是独立的, 2、用例a不要去依赖用例b 3、用例执行没先后顺序, 4、随机都能执行每个用例都能独立运行成功每个用例都能重复运行,不影响其它用例 这…

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第五节 引用类型复制问题及用克隆接口ICloneable修复

深入浅出图解C#堆与栈 C# Heaping VS Stacking 第五节 引用类型复制问题及用克隆接口ICloneable修复 [深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈](https://mp.csdn.net/mdeditor/101021023)[深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节…

九九乘法表c 语言 用于打印九九乘法表

以下是一个简单的C语言程序&#xff0c;用于打印九九乘法表&#xff1a; #include <stdio.h>int main() {int i, j;for (i 1; i < 9; i) {for (j 1; j < i; j) {printf("%d*%d%-2d ", j, i, i*j);}printf("\n");}return 0; }解释&#xff1…

JavaScript练习题第(四)部分

大家好关于JavaScript基础知识点已经发布&#xff1a;需要的大家可以去我的主要查看 &#xff08;当然了有任何不会的&#xff0c;可以私信我&#xff01;&#xff01;&#xff01;&#xff01;&#xff09; 为了巩固大家学习知识点给大家准备几道练习题&#xff1a; 当然&…

网络编程『简易TCP网络程序』

&#x1f52d;个人主页&#xff1a; 北 海 &#x1f6dc;所属专栏&#xff1a; Linux学习之旅、神奇的网络世界 &#x1f4bb;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 文章目录 &#x1f324;️前言&#x1f326;️正文TCP网络程序1.字符串回响1.1.核心功能1.2.程序…

CGAL的D维包围盒相交计算

包围盒相交测试是一种用于快速判断两个三维对象是否相交的方法&#xff0c;而AABB树则是一种数据结构&#xff0c;常用于加速场景中的射线检测和碰撞检测。 首先&#xff0c;让我们了解一下包围盒相交测试。这种测试的目的是为了快速判断两个三维对象是否相交&#xff0c;而不需…

同化的题解

时间限制: 1000ms 空间限制: 524288kB 题目描述 古人云&#xff1a;“近朱者赤近墨者黑”。这句话是很有道理的。这不鱼大大和一群苦命打工仔被安排进厂拧螺丝了。 进厂第一天&#xff0c;每个人拧螺丝的动力k都是不同且十分高涨的。但是当大家坐在一起后会聊天偷懒&#xf…

【算法刷题】python刷题--合并链表

[23] 合并 K 个升序链表 from typing import List,Optional class ListNode:def __init__(self, val0, nextNone):self.val valself.next next# lc codestart # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # …

在微服务中如何实现全链路的金丝雀发布?

目录 1. 什么金丝雀发布&#xff1f;它有什么用&#xff1f; 2.如何实现全链路的金丝雀发布 2.1 负载均衡模块 2.2 网关模块 2.3 服务模块 2.3.1 注册为灰色服务实例 2.3.2 设置负载均衡器 2.3.3 传递灰度发布标签 2.4 其他代码 2.4.1 其他业务代码 2.4.2 pom.xml 关…

利用C语言实现set——手搓set

在 C 语言中&#xff0c;可以使用数组来手动实现 Set&#xff08;集合&#xff09;的功能。具体来说&#xff0c;以下是一种简单的在 C 语言中手动实现 Set 的方法&#xff1a; 一、定义数组来存储set元素 首先&#xff0c;定义一个数组来存储 Set 的元素。数组中的每个元素代…

CSS 向上扩展动画

上干货 <template><!-- mouseenter"startAnimation" 表示在鼠标进入元素时触发 startAnimation 方法。mouseleave"stopAnimation" 表示在鼠标离开元素时触发 stopAnimation 方法。 --><!-- 容器元素 --><div class"container&q…

SAP VA01 创建带wbs号的销售订单包 CJ067的错误

接口错误提示如下 SAP官方 CJ067 124177 - VA01: CJ067 during WBS acct assgmt with a different business area S4的core 刚好能用上 实施 这个note后成功