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

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

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

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

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

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

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

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

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

场景代码:

kotlin 复制代码
val notificationMgr = NotificationOld()
notificationMgr.notify(NotificationLevel.SEVERE, "崩溃率飙升...")

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

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

kotlin 复制代码
//实现化角色-渠道通知
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,持有实现化角色:

kotlin 复制代码
//抽象化角色-通知动作
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)
    }
}

场景代码:

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

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

总结

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

相关推荐
孤廖4 分钟前
吃透 C++ 栈和队列:stack/queue/priority_queue 用法 + 模拟 + STL 标准实现对比
java·开发语言·数据结构·c++·人工智能·深度学习·算法
我命由我123457 分钟前
Android 对话框 - 对话框全屏显示(设置 Window 属性、使用自定义样式、继承 DialogFragment 实现、继承 Dialog 实现)
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
Full Stack Developme16 分钟前
java.net 包详解
java·python·.net
非凡的世界33 分钟前
深入理解 PHP 框架里的设计模式
开发语言·设计模式·php
一叶飘零_sweeeet35 分钟前
深入 Spring 内核:解密 15 种设计模式的实战应用与底层实现
java·spring·设计模式
凤山老林39 分钟前
排序算法:详解插入排序
java·开发语言·后端·算法·排序算法
彦楠43 分钟前
IDEA实用快捷键
java·ide·intellij-idea
豆沙沙包?1 小时前
2025年--Lc197-077. 排序链表(链表,尾插法)--Java版
java·数据结构·链表
m0_651593911 小时前
深入理解软件设计中的协议与规范:从理论到Java实践
java·软件工程·代码规范·设计规范
Mr_WangAndy1 小时前
C++设计模式_行为型模式_状态模式State
c++·设计模式·状态模式