津津乐道设计模式 - 桥接模式详解

在这里插入图片描述

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人CSND主页——Micro麦可乐的博客
🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
🌺《RabbitMQ》本专栏主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~

津津乐道设计模式 - 桥接模式详解

  • 什么是桥接模式
  • 桥接模式的适用场景
  • 代码案例
  • 桥接模式优缺点
  • 结语

什么是桥接模式

桥接模式(Bridge Pattern)是一种结构型设计模式,它将抽象部分和实现部分解耦,使它们可以独立地变化。桥接模式的核心思想是将抽象和实现通过桥接接口连接起来,使得它们可以独立地变化,而不会相互影响。
在这里插入图片描述

桥接模式的适用场景

  • 当系统中存在多个维度的变化时:桥接模式适用于存在多个维度的变化,并且每个维度都可以独立变化的情况。例如,一个图形绘制系统中有多种形状和多种颜色,桥接模式可以将形状和颜色抽象出来,并通过桥接接口将它们连接起来,从而可以灵活地组合不同的形状和颜色。
  • 当需要抽象和实现的解耦时:桥接模式可以将抽象部分和实现部分解耦,使它们可以独立地变化。这样可以避免类爆炸的问题,减少子类的数量,并且可以方便地扩展和修改系统的功能。
  • 当希望在运行时动态切换实现时:桥接模式可以在运行时动态切换实现,而不影响客户端代码。这使得系统更加灵活,可以根据不同的需求选择不同的实现。

总之,桥接模式适用于需要将抽象和实现解耦、存在多个维度的变化以及希望在运行时动态切换实现的情况。它可以提高系统的灵活性、可扩展性和可维护性。

代码案例

假设我们有一个咖啡店,它提供不同种类的咖啡和调料。我们可以使用桥接模式来实现咖啡和调料的抽象和实现的解耦。

首先,我们定义一个调料的接口 CoffeeAdditive,它有一个方法 add 用于添加调料:

public interface CoffeeAdditive {void add();
}

然后,我们实现具体的调料类,例如糖(SugarAdditive)和牛奶(MilkAdditive):

public class SugarAdditive implements CoffeeAdditive {@Overridepublic void add() {System.out.println("添加糖");}
}public class MilkAdditive implements CoffeeAdditive {@Overridepublic void add() {System.out.println("添加牛奶");}
}

然后,我们定义一个咖啡的抽象类 Coffee,它有一个抽象的方法 brew 用于冲泡咖啡:

public abstract class Coffee {protected CoffeeAdditive additive;public Coffee(CoffeeAdditive additive) {this.additive = additive;}public abstract void brew();
}

接着,我们实现具体的咖啡类,例如美式咖啡(AmericanCoffee)和拿铁咖啡(LatteCoffee):

public class AmericanCoffee extends Coffee {public AmericanCoffee(CoffeeAdditive additive) {super(additive);}@Overridepublic void brew() {System.out.println("冲泡美式咖啡");additive.add();}
}public class LatteCoffee extends Coffee {public LatteCoffee(CoffeeAdditive additive) {super(additive);}@Overridepublic void brew() {System.out.println("冲泡拿铁咖啡");additive.add();}
}

最后,我们可以创建具体的咖啡对象,并指定不同的调料:

public class BridgePatternTest {public static void main(String[] args) {CoffeeAdditive sugar = new SugarAdditive();CoffeeAdditive milk = new MilkAdditive();Coffee americanCoffeeWithSugar = new AmericanCoffee(sugar);Coffee latteCoffeeWithMilk = new LatteCoffee(milk);americanCoffeeWithSugar.brew();System.out.println("==========================");latteCoffeeWithMilk.brew();}
}

整体案例代码结构如下
在这里插入图片描述
最后输出结果
在这里插入图片描述

通过桥接模式,我们将咖啡和调料部分以及具体的调料实现分离开来。这样,我们可以独立地扩展咖啡和调料的种类,并且可以根据需要自由地组合不同的咖啡和调料,而不会相互影响。这使得系统更加灵活,并且可以根据不同的需求创建出各种不同口味的咖啡。

桥接模式优缺点

桥接模式的优点包括:

  • 解耦抽象和实现:桥接模式将抽象和实现部分分离,使它们可以独立地变化,减少了它们之间的耦合关系。这样,对于抽象部分的修改不会影响到实现部分,也可以方便地扩展和修改系统的功能。

  • 提高灵活性:桥接模式可以在运行时动态地切换和组合抽象和实现,从而提高系统的灵活性。可以根据不同的需求选择不同的实现,并且可以在不修改客户端代码的情况下切换实现。

  • 支持单一职责原则:桥接模式将抽象和实现分离,使每个部分都有自己的职责。这符合单一职责原则,每个类只需要关注自己的领域,不会承担过多的责任。

  • 可扩展性强:由于桥接模式将抽象和实现解耦,因此可以方便地扩展新的抽象和实现类,而不会对现有的代码产生影响。这使得系统更容易进行功能扩展和维护。

桥接模式的缺点包括:

  • 增加了系统的复杂性:引入桥接模式会增加额外的抽象和实现类,增加了系统的复杂性和理解难度。因此,在设计时需要权衡利弊,避免过度使用桥接模式导致系统变得复杂而难以维护。

  • 增加了代码量:桥接模式需要定义抽象和实现之间的桥接接口,并且需要实现具体的抽象和实现类。这会增加代码量,对于简单的系统可能显得有些冗余。

结语

总的来说,桥接模式适用于需要将抽象和实现解耦、存在多个维度的变化、希望在运行时动态切换实现以及增强系统的灵活性和可扩展性的情况。然而,需要注意在使用桥接模式时,避免过度设计和过度复杂化,保持适度的简洁性和可读性。

如果本文对你有用,欢迎关注收藏评论,后续将陆续推出贴切生活的搞笑讲解方式带大家一起学编程~

样例代码:https://github.com/lhmyy521125/toher-designmode

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

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

相关文章

clop勒索软件攻击活动频发,西门子能源中招

自6月初被通报利用MOVEit Transfer服务器中的零日漏洞窃取加密组织数据后,clop勒索软件攻击活动频繁,全球陆续发生了多起clop软件攻击事件。本周,Clop团伙在其数据泄露网站上列出了西门子能源公司的信息,表示该公司的数据被泄露。…

【数据结构】队列——顺序实现+链式实现(带头结点+不带头结点)入队 出队 初始化 判空 双端队列 完整代码

文章目录 四 队列1.基本概念2.队列的顺序存储3.队列的链式实现3.1 定义3.2 带头结点3.2.1 初始化3.2.2 判空3.2.3 入队3.2.4 出队3.2.5 完整代码 3.3 不带头结点3.3.1 初始化3.3.2 入队3.3.3 出队3.3.4 完整代码 4.双端队列 四 队列 1.基本概念 定义 只允许在一端进行插入&…

基于人工智能与边缘计算Aidlux的鸟类检测驱赶系统(可修改为coco 80类目标检测)

●项目名称 基于人工智能与边缘计算Aidlux的鸟类检测驱赶系统(可修改为coco 80类目标检测) ●项目简介 本项目在Aidlux上部署鸟类检测驱赶系统,通过视觉技术检测到有鸟类时,会进行提示。并可在源码上修改coco 80类目标检测索引直…

Kotlin Jetpack Compose - 实现Tab布局

Tab布局是一种常见的UI设计,它允许用户在不同的视图或数据集之间切换。我们将使用Jetpack Compose的 TabRow 和 ScrollableTabRow 组件来实现这个布局。 一、基本的Tab布局——TabRow 二、滚动的Tab布局——ScrollableTabRow 组件 三、自定义Tab组件 一、基本的T…

appium如何连接多台设备

目录 前言: 1.我们拿两台设备来模拟操作下,使用:adb devices查看连接状况,获取到设备名称。 2.获取需要操作app的包名和页面名称(前提该设备已经打开了app) 3.设置初始配置信息 4.打开页面后操作元素&am…

Spring MVC相关注解运用 —— 上篇

目录 一、Controller、RequestMapping 1.1 示例程序 1.2 测试结果 二、RequestParam 2.1 示例程序 2.2 测试结果 三、RequestHeader、CookieValue 3.1 示例程序 3.2 测试结果 四、SessionAttributes 4.1 示例程序 4.2 测试结果 五、ModelAttribute 5.1 示例程序 …

A核与M核异构通信过程解析

现在越来越多的产品具有M core和A core的异构架构,既能达到M核的实时要求,又能满足A核的生态和算力。比如NXP的i.MX8系列、瑞萨的RZ/G2L系列以及TI的AM62x系列等等。虽然这些处理器的品牌及性能有所不同,但多核通信原理基本一致,都…

Spring Boot中的SimpMessagingTemplate是什么,原理,以及如何使用

Spring Boot中的SimpMessagingTemplate是什么,原理,以及如何使用 SimpMessagingTemplate是Spring Framework中的一个类,用于向WebSocket客户端发送消息。在Spring Boot应用程序中,可以使用SimpMessagingTemplate来实现WebSocket通…

OpenCV 学习笔记(C++)(1.4W字)

一切图像皆Mat OpenCV中图像对象的创建与复制 Mat基本结构 Mat对象数据组成:头部和数据部分,头部存储图像的属性(大小、宽高、图像类型:浮点数类型、字节类型、16位整型、32位整型、双精度浮点型,通道数量和获取途径…

【微服务】什么是微服务?-- 全面了解微服务架构

What is Microservices — Edureka 您有没有想过,什么是微服务以及扩展行业如何与它们集成,同时构建应用程序以满足客户的期望? 要了解什么是微服务,您必须了解如何将单体应用程序分解为独立打包和部署的小型微型应用程序。本文将…

在windows server上用Mosquitto软件创建MQTT服务器

今天下午捣鼓了半天,在云服务器上面创建了个MQTT服务器,然后用MQTTX软件进行了测试。过程记录如下: 1、下载mosquitto软件,链接如下图: 2、下载完成后安装,一直点下一步下一步就好了。 3、在安装路径下&am…

CHATGPT使用笔记

CHATGPT是帮你做事,而不是替你做事 1、联网插件: 使用Webpilot插件联网时还可以同时使用其它两种插件(一次可以同时使用三个插件),而使用Web Browsing插件功能联网时无法使用插件功能(联网功能和插件只能…