java的设计模式之桥接模式(Bridge)

之前遇到过一个采用发送邮件和发送短信的方式低级中级高级三种告警通知,当时做的很潦草,现在发现了大佬的文章桥接模式,我感觉很好,非常适用那个场景,于是想发出来,各位都看看

桥接模式包含以下四个关键角色:

抽象化: 定义抽象类的接口,并维护一个指向实现化对象的引用。

扩展抽象化: 抽象化的子类,可以扩展或修改父类的接口。

实现化: 定义实现类的接口。这个接口不一定要与抽象化的接口完全一致,通常更基础。

具体实现化: 实现化接口的具体类。

java 复制代码
//通知 抽象类
abstract class Notification {

    protected MessageSender sender;

    public Notification(MessageSender sender) {
        this.sender = sender;
    }
    public abstract void notify(String message);
}
java 复制代码
package com.sailing.hsm.bridge;

/**
 *  扩展的抽象 低级告警
 * @author guanc
 * @ClassName LowLevelNotification
 * @date 2025年11月07日
 * @version: 1.0
 */
public class LowLevelNotification extends Notification{

    public LowLevelNotification(MessageSender sender) {
        super(sender);
    }

    @Override
    public void notify(String message) {
        sender.send( message);
    }
}
java 复制代码
package com.sailing.hsm.bridge;

/**
 *  扩展的抽象 中级告警
 * @author guanc
 * @ClassName LowLevelNotification
 * @date 2025年11月07日
 * @version: 1.0
 */
public class IntermediateNotification extends Notification{

    public IntermediateNotification(MessageSender sender) {
        super(sender);
    }

    @Override
    public void notify(String message) {
        //重试逻辑 尝试发送3次
        int retries = 3;
        while (retries > 0){
            try {
                sender.send( message);
                break;
            } catch (Exception e) {
                retries--;
            }
        }
    }
}
java 复制代码
package com.sailing.hsm.bridge;

/**
 *  扩展的抽象 高级
 * @author guanc
 * @ClassName LowLevelNotification
 * @date 2025年11月07日
 * @version: 1.0
 */
public class AdvancedNotification extends Notification{

    private long delayInSecond;

    public AdvancedNotification(MessageSender sender,long delayInSecond) {
        super(sender);
        this.delayInSecond = delayInSecond;
    }

    @Override
    public void notify(String message) {
       new Thread(() -> {
           try {
               Thread.sleep(delayInSecond * 1000);
               sender.send( message);
           } catch (InterruptedException e) {
               e.printStackTrace();
           }
       }).start();
        System.out.println("延迟了" + delayInSecond + "秒后发送");
    }
}
java 复制代码
package com.sailing.hsm.bridge;

/**
 * 实现的接口 消息发送器
 * @author guanc
 * @ClassName MessageSender
 * @date 2025年11月07日
 * @version: 1.0
 */
interface MessageSender {
   void send(String message);
}
java 复制代码
package com.sailing.hsm.bridge;

/**
 * 短信发送器
 * @author guanc
 * @ClassName EmailSender
 * @date 2025年11月07日
 * @version: 1.0
 */
public class SmsSender implements MessageSender{
    @Override
    public void send(String message) {
        System.out.println("短信发送:" + message);
    }
}
java 复制代码
package com.sailing.hsm.bridge;

/**
 * 短信发送器
 * @author guanc
 * @ClassName EmailSender
 * @date 2025年11月07日
 * @version: 1.0
 */
public class EmailSender implements MessageSender{
    @Override
    public void send(String message) {
        System.out.println("发送邮件:" + message);
    }
}
java 复制代码
package com.sailing.hsm.bridge;

/**
 *
 * @author guanc
 * @ClassName TestDemo
 * @date 2025年11月07日
 * @version: 1.0
 */
public class TestDemo {
    public static void main(String[] args) {
        MessageSender emailSender = new EmailSender();
        MessageSender smsSender = new SmsSender();
        //中级告警+短信
        Notification intermediateNotification = new IntermediateNotification(smsSender);
        intermediateNotification .notify("内存占用百分之90了,少年还不来看看!!!");
        //低级告警+邮件
        Notification lowLevelNotification = new LowLevelNotification(emailSender);
        LowLevelNotification.notify(" 内存占用百分之80,少年来看看吧!");
        //高级告警+短信
        Notification advancedNotification = new AdvancedNotification(smsSender,6);
        advancedNotification .notify("服务器爆炸了,赶紧修复啊!!!" );
    }
}

它的适用场景

  • 当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。

  • 当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。

  • 不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。

  • 需要对抽象部分和实现部分进行动态绑定时。

咋一看桥接模式与适配器模式有点类似,但是你仔细看会发现很大不同:

桥接模式: 在设计之初就使用,目的是将抽象和实现分离,以便它们可以独立变化。它是一种前瞻性的设计。

适配器模式: 通常在设计之后使用,目的是让两个原本不兼容的接口能够协同工作。它是一种补救性的设计。

相关推荐
世人万千丶12 分钟前
鸿蒙项目实战 - 社区活动编排板:标签云布局算法与自动换行
学习·算法·华为·harmonyos·鸿蒙
zander25815 分钟前
LeetCode 279. 完全平方数
算法·深度优先
xierui12312332 分钟前
AI Agent 隐私架构:本地化重点为什么是登录态与执行权限
java·人工智能·网络安全·架构
cfm_291443 分钟前
Spring AI Tool 调用架构全解
java·人工智能·spring
sun༒1 小时前
Spring @Scheduled 定时任务详解:Cron表达式、执行顺序、优先级与并行调度
java·后端·spring
一次旅行1 小时前
DeepSeek‑V4‑Flash‑Vision‑Exp 小白入门实战|3种传图方式、完整可跑代码、避坑排障
java·前端·人工智能
典典分享指南1 小时前
VS Code Git 工作树:解锁多分支并行开发新体验
算法·决策树·逻辑回归·启发式算法
野生技术架构师1 小时前
Spring Boot 实现数据脱敏:自定义注解 + Jackson 序列化器
java·spring boot·后端
AI人工智能+电脑小能手1 小时前
大白话说Java设计模式-28-模板方法模式(业务实战篇)
java·设计模式·模板方法模式·spring源码·订单系统·代码复用
奥莱维2 小时前
KNX酒店方案_KNX专用线与高端酒店技术逻辑
java·服务器·前端·数据库