设计模式-桥接模式

桥接模式,也叫作桥梁模式,英文是 Bridge Design Pattern。桥接模式的定义是“将抽象和实现解耦,让它们可以独立变化”。不过还有另外一种解释:“一个类存在两个(或多个)独立变化的维度,我们通过组合的方式,让这两个(或多个)维度可以独立进行扩展。”

案例分析

该模式的场景一般为多对多且能动态组合,例如一个监控告警系统,监控分为多个程度,例如严重、一般;告警分为多个方式,例如电话、邮箱、站内信。桥接模式结构如图:

image-20251003175030039

MsgSender 为接口,定义了发送通知消息的方法,Phone、Email 等分别实现接口用来真实发送消息;抽象类 Notification 定义抽象方法 notify,交由子类 Urgency、Normal 重写。

public interface MsgSender {

    void sendMessage(String message);

}

public class EmailSender implements MsgSender {

    private List<String> emails;

    public EmailSender(List<String> phones) {
        this.emails = phones;
    }

    @Override
    public void sendMessage(String message) {
        for (String email : emails) {
            System.out.println("邮件通知:" + email);
        }
    }

}

public abstract class Notification {

    protected MsgSender msgSender;

    public Notification(MsgSender msgSender) {
        this.msgSender = msgSender;
    }

    public abstract void notify(String msg);

}

public class NormalNotification extends Notification {

    public NormalNotification(MsgSender msgSender) {
        super(msgSender);
    }

    @Override
    public void notify(String message) {
        msgSender.sendMessage(message);
    }

}

上述的结构设计中 Notification 类相当于抽象,MsgSender 类相当于实现,两者可以独立开发,通过组合关系(也就是桥梁)任意组合在一起。所谓任意组合的意思就是,不同紧急程度的消息和发送渠道之间的对应关系,不是在代码中固定写死的,我们可以动态地去指定(比如,通过读取配置来获取对应关系)。

image-20251003180753117

这里的“抽象”和“实现”并不完全是指的并非“抽象类”或“接口”,而是被抽象出来的一套“类库”,它只包含骨架代码,真正的业务逻辑需要委派给定义中的“实现”来完成。而定义中的“实现”,也并非“接口的实现类”,而是的一套独立的“类库”。“抽象”和“实现”独立开发,通过对象之间的组合关系,组装在一起。

其实桥接模式在 JDBC、Java 日志系统中都有所体现,SLF4J 日志标准中,既有适配器模式,也有桥接模式。

image-20251003181638513

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐