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

news2024/11/14 5:38:04

在这里插入图片描述

😄 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 {
    @Override
    public void add() {
        System.out.println("添加糖");
    }
}

public class MilkAdditive implements CoffeeAdditive {
    @Override
    public 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);
    }

    @Override
    public void brew() {
        System.out.println("冲泡美式咖啡");
        additive.add();
    }
}

public class LatteCoffee extends Coffee {
    public LatteCoffee(CoffeeAdditive additive) {
        super(additive);
    }

    @Override
    public 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.coloradmin.cn/o/689413.html

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

相关文章

选择C#还是Qt作为上位机开发工具:如何做出最佳决策?

选择C#还是Qt作为上位机开发工具取决于你的具体需求和偏好。以下是一些优化因素供你考虑:跨平台支持:如果你的应用程序需要在多个操作系统上运行,Qt可能是更好的选择,因为它具有强大的跨平台能力。Qt可以帮助你开发具备一致性和可…

演讲实录丨神策数据桑文锋:双引擎赋能数字化客户经营

在「开放融合,引领营销 5.0 新纪元——暨 2023 年金融营销科技价值发现论坛」现场,神策数据创始人 & CEO 桑文锋发表了《双引擎赋能数字化客户经营》的主题演讲,围绕“用户/客户数据平台”和“旅程编排引擎”双引擎做了详细介绍。 本文根…

SpringBoot项目-双人对战五子棋实验报告

简单五子棋Web项目报告 课 程 Web应用程序设计 项目名称 简单双人五子棋对战 成绩 专业班级 XXX 组别 无 学号 XXX 指导教师 XXX 姓 名 XXX 同组人姓名 无 完成日期 XXX 功能描述 1.用户的注册及登录功能 玩家可以在完成游戏账户的注册&#xff0c…

uni-app 数字输入框组件封装

文章目录 前言一、创建数字输入框文件二、制作数字输入框组件三、父组件调用 前言 数字输入框是一个项目中常见的需求,其中的耦合度很高,完全可以将其封装起来使用,在使用的时候传入五个参数,分别为: 最大值最小值默…

RUST 运行是报 linker `link.exe` not found

如下图所示: 解决方法: 第一步: rustup toolchain install stable-x86_64-pc-windows-gnu 第二步: rustup default stable-x86_64-pc-windows-gnu 验证:

关于全局异常提示

项目中客户端请求如果后端出现技术上的bug,会报出网络异常,这对客户是很不友好的,比方说请求参数格式校验,如下: import com.fasterxml.jackson.annotation.JsonFormat; 假如日期格式传的不对,这个注解校验…

I3C协议手册研读-1

0 前言 对于I3C,我觉得有必要仔细分析一下手册,通过博客的方式来进行,可以更好的督促自己进行学习。 本次研读的I3C手册版本如下图所示。 1 介绍 阿兴分析如下: 目前比较成熟的协议有I2C、SPI、USART等,但是因为有一…

网络安全合规-ISO 27701(二)

隐私信息安全管理体系(PIMS)认证 是在隐私保护方面对 ISO/IEC 27001 和ISO/IEC 27002 的扩展,针对保护可能受到个人信息收集和处理影响的隐私提供了更多相关指南。获得PIMS认证的企业标志着其在保护用户数据和个人信息安全方面符合国际标准IS…

怎么学习和提升后端开发能力? - 易智编译EaseEditing

学习和提升后端开发能力可以通过以下步骤进行: 学习编程语言: 选择一种常用的后端编程语言,如Python、Java、C#等,并深入学习该语言的语法、特性和最佳实践。掌握基本的编程概念和技巧是提升后端开发能力的基础。 学习数据库&am…

微信小程序:期末大作业,毕业设计茶客堂商城微信小程序

1. 项目简介 茶客堂微信小程序是一个为茶叶爱好者提供优质茶叶和茶文化知识的平台。茶作为中国的传统文化,越来越受到各个年龄层的人们的喜爱。而传统的茶叶销售方式有一定的局限性,如茶叶品质无法保证、价格不透明等。茶客堂微信小程序应运而生&#x…

【软考网络管理员】2023年软考网管初级常见知识考点(23)- 路由器的配置

涉及知识点 华为路由器的配置,华为路由器命令大全,软考大纲路由命令,静态路由和动态路由的配置命令,软考网络管理员常考知识点,软考网络管理员网络安全,网络管理员考点汇总。 原创于:CSDN博主-…

GPT快速分区

经过刚刚的“转换分区表类型为GUID格式”设置之后,现在分区的分区表类型已经是GPT格式了。我们设置想要分区的数目,例如我想要分两个区,点击自定选择2个分区,系统C盘分了80G,剩下空间留给了D盘。默认勾选“创建新ESP分…

jenkins流水线Pipeline的使用

pipeline流水线 1、jenkins安装pipeline插件 2、创建流水线项目 1、创建pipeline的流水线项目 2、编写流水线 pipeline {agent anystages {stage(拉去代码) {steps {git credentialsId: gitee, url: https://gitee.com/xwb1056481167/jenkins-demo.gitecho 拉去代码}}stage(m…

C. Tenzing and Balls(dp)

Problem - C - Codeforces Tenzing在一条线上排列了n个球。从左边起第i个球的颜色是ai。 Tenzing可以进行以下操作任意次&#xff1a; 选择i和j&#xff0c;使得1≤i<j≤|a|且aiaj&#xff0c; 从数组中删除ai,ai1,…,aj&#xff08;并将所有元素的索引向右移动aj−i1&…

【Linux】基于FTP协议实现Linux与Windows文件传输

文章目录 前言(一) Linux FTP网络环境搭建1.安装ftp包2. 置匿名用户访问的FTP服务(最大权限)3.为匿名访问ftp的根目录下的pub子目录设置最大权限&#xff0c;以便匿名用户上传数据4. 开启服务&#xff0c;关闭防火墙和增强型安全功能 &#xff08;二&#xff09;Windows 设置测…

前端食堂技术周刊第 88 期:Svelte4、NestJS 10、State of CSS 2023、Vitest 1.0 Roadmap、Fresh 1.2

美味值&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f; 口味&#xff1a;帝王蟹柳 食堂技术周刊仓库地址&#xff1a;https://github.com/Geekhyt/weekly 大家好&#xff0c;我是童欧巴。欢迎来到前端食堂技术周刊&#xff0c;我们先来看下…

Insertion插入排序

原谅我接着偷懒&#xff0c;是真的没有什么写的内容了啊&#xff0c;好怀疑他们那些大佬是怎么那么多的文章和技术分享的&#xff0c;自闭中ing 最好情况的时间复杂度是 O(n)&#xff0c;最坏情况的时间复杂度是 O(n2)&#xff0c;然而时间复杂度这个指标看的是最坏的情况&…

Oracle 查询优化改写(第七章)

第七章 日志运算 1 加减年月日时分秒 替换为- --加减年月日时分秒 替换为- SELECT Add_Months(SYSDATE, 5 * 12) AS 加5年,Add_Months(SYSDATE, 5) AS 加5月&#xff0c;SYSDATE 5 AS 加5天,SYSDATE 5 / 24 AS 加5小时,SYSDATE 5 / 24 / 60 AS 加5分钟,SYSDATE 5 / 24 / …

【宝塔服务器】宝塔通过composer安装TP依赖

屡屡碰壁&#xff0c;安装一个项目&#xff0c;发现没有依赖&#xff0c;需要使用composer安装&#xff0c;没接触过&#xff0c;找了网上也没攻略&#xff0c;自己弄了后有以下问题&#xff0c;经过调整解决了&#xff1a; 报错1:没有安装fileinfo扩展 Loading composer rep…

Debian 安装gcc, g++

自从周日把刚把安装好的Debian12搞坏后&#xff0c;这两天一直在重装系统&#xff0c;就没有完全成功过&#xff0c;好在最后一次安装Debian11的时候&#xff0c;系统起来后有网络&#xff0c;但在安装桌面及GNOME时失败了&#xff0c;只能开机进入命令行模式。 安装gcc 和 g 只…