重修设计模式-结构型-桥接模式

news2024/11/10 13:22:31

重修设计模式-结构型-桥接模式

将抽象和实现解耦,让它们可以独立变化

桥接模式(Bridge Pattern)的主要目的是解耦,创建一个抽象层来隔离接口与实现,让它们之间的依赖关系可以通过对象的组合来替代继承,从而达到解耦的目的。

在这里插入图片描述

桥接模式通常由四个部分组成:

  1. 抽象角色(Abstraction):定义了一个抽象类的接口,这个接口拥有一个指向实现对象的引用。通过这个引用,抽象化角色可以调用实现角色的方法。
  2. 实现角色(Implementor):为抽象角色提供了一组接口,用于实现特定的业务逻辑。通常它是一组接口,用来定义需要实现的方法。
  3. 扩展抽象角色(Refined Abstraction):扩展抽象角色,对其进行修改定制。通常它包含一些基本的实现,并在其中调用实现角色的方法。
  4. 具体实现角色(Concrete Implementor):具体实现了实现角色定义的接口,用于完成特定的业务逻辑。

桥梁模式中的几个名词比较拗口,只要记住一句话:抽象角色的部分实现是由实现角色完成的,两者都可以独立扩展并灵活组合

举个例子,应用性能监控的告警系统:根据告警规则,触发不同级别的消息通知,如SEVERE(严重)、URGENCY(紧急)、NORMAL(普通)。同时还有多种不同的通知渠道,如电话、短信、邮件。不同级别信息也会通过不同的渠道通知,比如SEVERE级别消息需要通过电话通知。下面用最简单、最直接实现方式如下:

class NotificationOld {
    fun notify(level: NotificationLevel, message: String) {
        when (level) {
            NotificationLevel.SEVERE -> {
                println("电话通知:${message}")  //逻辑可能很复杂,这里只打印日志
            }
            NotificationLevel.URGENCY -> {
                println("短信通知:${message}")
            }
            NotificationLevel.NORMAL -> {
                println("邮件通知:${message}")
            }
        }
    }
}

场景代码:

val notificationMgr = NotificationOld()
notificationMgr.notify(NotificationLevel.SEVERE, "崩溃率飙升...")

可见 notify 方法中每个分支中的代码逻辑都比较复杂,发送通知的所有逻辑都扎堆在 NotificationOld 类中,如果新增消息级别和通知渠道,则又要改动分支代码,可能影响原有逻辑,也不符合开闭原则。

下面使用桥接模式对代码进行改造,首先将不同渠道的通知逻辑剥离出来,形成独立的渠道通知类(NotifyChannel相关类):

//实现化角色-渠道通知
interface NotifyChannel {
    fun sendMsg(message: String)
}

//实现化角色-电话
class TelephoneChannel : NotifyChannel {
    override fun sendMsg(message: String) {
        println("电话通知:${message}")
    }
}

//实现化角色-短信
class SMSChannel : NotifyChannel {
    override fun sendMsg(message: String) {
        println("短信通知:${message}")
    }
}

//实现化角色-邮件
class EmailChannel : NotifyChannel {
    override fun sendMsg(message: String) {
        println("邮件通知:${message}")
    }
}

定义抽象角色 Notification,持有实现化角色:

//抽象化角色-通知动作
abstract class Notification(val channel: NotifyChannel) {
    abstract fun notify(message: String)
}

//扩展抽象化角色-SEVERE级消息通知动作
class SevereMsgNotification(channel: NotifyChannel) : Notification(channel) {
    override fun notify(message: String) {
        channel.sendMsg(message)
    }
}

//扩展抽象化角色-URGENCY级消息通知动作
class UrgencyNotification(channel: NotifyChannel) : Notification(channel) {
    override fun notify(message: String) {
        channel.sendMsg(message)
    }
}

//扩展抽象化角色-NORMAL级消息通知动作
class NormalNotification(channel: NotifyChannel) : Notification(channel) {
    override fun notify(message: String) {
        channel.sendMsg(message)
    }
}

场景代码:

//桥接实现-自由组合消息级别和通知渠道
val telephoneChannel = TelephoneChannel()
val severeNotification = SevereMsgNotification(telephoneChannel)
severeNotification.notify("崩溃率飙升...")

Notification 是抽象角色,NotifyChannel 是实现角色,两者可以进行独立开发和灵活扩展,并通过组合关系(也就是桥梁)任意组合在一起。开发中如果涉及一组类和另一组类的组合关系,就可以考虑桥接模式了。

总结

桥接模式是一种非常灵活的设计模式,适用于多种场景,尤其是在需要跨多个维度的变化和组合时,它可以提供强大的解耦能力。

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

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

相关文章

运维学习————运维日志分析系统es——Elasticsearch

目录 一、简介 1、全文检索 1、数据分类 2、非结构化数据搜索方法 2、什么是 Elasticsearch 3、用途 4、基本概念 二、下载配置,搭建集群 集群规划 解压 配置环境变量 es配置 由于es启动不能直接使用root用户 启动 三、常用集群命令 一、简介 …

可提示 3D 分割研究里程碑!SAM2Point:SAM2加持泛化任意3D场景、任意提示!

郑重声明:本解读已获得论文作者的原创解读授权 文章链接:https://arxiv.org/pdf/2408.16768 在线demo: https://huggingface.co/spaces/ZiyuG/SAM2Point code链接:https://github.com/ZiyuGuo99/SAM2Point 亮点直击 无投影 3D 分割&#xff1…

DAY14信息打点-JS 架构框架识别泄漏提取API 接口枚举FUZZ 爬虫插件项目

本课意义: 1.如何从表现中的JS提取价值信息 2.如何从地址中FUZZ提取未知的JS文件 3.如何从JS开放框架WebPack进行测试 一、JS 前端架构-识别&分析 在JS中寻找更多的URL地址,在JS代码逻辑(加密算法、APIKey配置、验证逻辑)中进…

C语言——静态链表和动态链表

一、静态链表 创建链表中的一个节点,用struct来创建,其中包含两个部分:数据域和指针域。 创建三个结点,node1、node2、node3,分别赋值,初始化为NULL。接着就是将这些节点进行连接,组成链表。连…

干货分享|分享一款完全免费的PDF工具箱 PDF24

PDF 24介绍: PDF 24是一个全面的PDF工具包,旨在简化和优化PDF文件的处理和管理。它提供了广泛的功能和工具,包括创建、编辑、转换、合并、拆分、加密、解密、压缩、优化、签名、水印等。 主要特点:完全免费,轻量便捷,…

现货黄金避险属性是怎么来的?

众所周知,黄金是一种可以规避风险的品种,当地缘局势冲突、经济下行,甚至是出现军事摩擦等等情况,黄金都会受到避险情绪支撑而上涨。典型的例子,我们可以看俄乌冲突,还有中东的地缘局势等,这些事…

TS 常用类型

我们经常说TypeScript是JavaScript的一个超级 TypeScript 常用类型 TypeScript 是 JS 的超集,TS 提供了 JS 的所有功能,并且额外的增加了:类型系统 所有的 JS 代码都是 TS 代码 JS 有类型(比如,number/string 等&…

OPENAIGC开发者大赛企业组AI黑马奖 | 包你面-AI面试助手

在第二届拯救者杯OPENAIGC开发者大赛中,涌现出一批技术突出、创意卓越的作品。为了让这些优秀项目被更多人看到,我们特意开设了优秀作品报道专栏,旨在展示其独特之处和开发者的精彩故事。 无论您是技术专家还是爱好者,希望能带给您…

Linux基础知识之用户和组

Linux基础知识之用户和组 01 1.什么是用户 用户账户为不同人员和运行的程序之间提供安全边界 用户使用 username 进行标识,操作系统为其分配唯一标识号(UID),用户可能含有密码 系统中的每个程序都以一个特定用户运行&#xff…

上/下三角矩阵的压缩存储

1.给自己出题:自己动手创造,画一个5行5列的下三角矩阵 2.画图:按“行优先”压缩存储上述矩阵,画出一维数组的样子 3.简答:写出元素 i,j 与 数组下标之间的对应关系 4.画图:按“列优先”压缩存储上述矩阵…

【卷起来】VUE3.0教程-06-组件详解

各位看官,点波关注和赞吧 组件允许我们将 UI 划分为独立的、可重用的部分,并且可以对每个部分进行单独的思考。在实际应用中,组件常常被组织成层层嵌套的树状结构: 这和我们嵌套 HTML 元素的方式类似,Vue 实现了自己的…

ssrf漏洞利用+CTF实例

引发ssrf漏洞的几个函数 file_get_contents() 把整个文件读入一个字符串中,获取本地或者远程文件内容fsockopen() 获得套接字信息curl_exec() 执行一个curl会话,由curl_init()初始化一个新的会话,返回一个curl句柄fopen() 打开文件或者URLre…

【数据结构与算法 | 灵神题单 | 插入链表篇】力扣2807, LCR 029, 147

1. 力扣2807:在链表中插入最大公约数 1.1 题目: 你一个链表的头 head ,每个结点包含一个整数值。 在相邻结点之间,请你插入一个新的结点,结点值为这两个相邻结点值的 最大公约数 。 请你返回插入之后的链表。 两个…

前端开发macbook——NVM环境配置以及git配置流程

本文主要针对前端使用mac电脑时需要安装nvm对应环境,一文解决环境安装问题 主要步骤如下: 安装homebrew 安装nvm 安装git 第一步:安装homebrew /bin/bash -c "$(curl -fsSL https:/raw.githubusercontent.com/Homebrew/install/HE…

C++基础(七):类和对象之深浅拷贝问题(中-3)

在C编程中,拷贝构造函数是对象复制的核心机制,尤其是在处理对象间的值传递时。当一个对象通过拷贝另一个对象来初始化时,浅拷贝只是简单地复制对象的成员变量的值。如果对象包含指针成员,浅拷贝只复制指针地址,这可能会…

基于matlab交通标志识别系统用的APP designer设计的gui界面 交互原理:bp神经网络-训练好图像处理有灰度化-二值化-颜色区域定位识别

基于MATLAB的交通标志识别系统是一个实用的工具,用于识别道路交通标志。该系统结合了图像处理技术和BP神经网络模型,可以在给定的图像中定位并识别交通标志。通过使用MATLAB的App Designer工具,系统还提供了一个交互式的图形用户界面&#xf…

【idea-安装】

JetBrains官⽹ : https://www.jetbrains.com/ 1.下载idea安装包,下载旧一些的版本,避免新版本的不稳定。 下载下来的安装包是exe格式的,直接点击运行。 点击Next 2.选择要下载的位置,点击下一步。 3.选择⽣成快捷⽅式和建⽴⽂件…

从头开始学MyBatis—01搭建基础框架

首先对mybatis进行一个简单的介绍,然后从最基础的准备工作开始搭建一个mybatis的开发 环境,最后通过简单的增删改查来熟悉配置文件和映射文件的编写。 目录 1.Mybaits简介 2.开发环境和准备工作 2.1开发环境 2.2pom文件 2.3数据库和表 2.4对应实体…

探索Python世界的隐藏宝石:Pika库的神秘力量

文章目录 探索Python世界的隐藏宝石:Pika库的神秘力量背景:为何选择Pika?Pik库简介如何安装Pika?简单库函数使用方法场景应用常见Bug及解决方案总结 探索Python世界的隐藏宝石:Pika库的神秘力量 背景:为何…

【机器学习】8 ——朴素贝叶斯

机器学习 8 ——朴素贝叶斯 特征条件独立假设 朴素是指每个特征独立地影响结果,整个假设在实际应用中不成立,主要是思想 输入输出的来拟合概率分布,贝叶斯定理,后验概率最大 文章目录 机器学习 8 ——朴素贝叶斯前言贝叶斯定理先…