概念
它通过将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦
应用场景
1)当出现多对多业务场景时,使用桥接模式可以各自实现每一部分,不会产生笛卡尔积中组合结果
2)将抽象与实现分开,各自可以独立的变化。抽象方法只作为具体实现中的某一步。修改时可以灵活修改,而不是在抽象类中编写大量的方法交给客户端选择调用。
通俗讲,桥接模式就是在两个可能独立变化的部分之间搭一座“桥”,让它们能灵活组合,而不是死死绑定

基本结构

1)抽象化(Abstraction):定义抽象的接口,同时维护一个对实现化对象(Implementor)的引用
2)扩展抽象化(Refined Abstraction):在抽象化基础上扩展,调用实现化对象的方法,增加新的功能
3)实现化(Implementor):定义实现化角色的接口,它不需要与抽象化接口完全一样,但一般要提供基本操作
4)具体实现化(Concrete Implementor):真正去实现实现化接口的类,完成具体的业务逻辑
代码实现
以 “消息推送系统” 为例
Implementor
定义发送渠道接口:表示消息发送的底层实现渠道
public interface MessageSender {
void send(String message);
}
ConcreteImplementor
实现不同的发送渠道:封装具体发送逻辑
public class EmailSender implements MessageSender {
public void send(String message) {
System.out.println("通过【邮件】发送消息:" + message);
}
}
public class SMSSender implements MessageSender {
public void send(String message) {
System.out.println("通过【短信】发送消息:" + message);
}
}
public class WeChatSender implements MessageSender {
public void send(String message) {
System.out.println("通过【微信】发送消息:" + message);
}
}
Abstraction
定义抽象消息类:对外提供发送消息的统一入口
public abstract class Message {
protected MessageSender sender;
public Message(MessageSender sender) {
this.sender = sender;
}
public abstract void send(String content);
}
RefinedAbstraction
实现不同的消息类型:定义业务维度的扩展
public class NormalMessage extends Message {
public NormalMessage(MessageSender sender) {
super(sender);
}
public void send(String content) {
System.out.println("【普通通知】开始发送...");
sender.send(content);
}
}
public class UrgentMessage extends Message {
public UrgentMessage(MessageSender sender) {
super(sender);
}
public void send(String content) {
System.out.println("【紧急告警】开始发送...");
sender.send("【加急】" + content);
}
}
客户端
组合不同类型和渠道,灵活发送
new 出不同的渠道,提供给外层不同的消息类型
public class Client {
public static void main(String[] args) {
MessageSender emailSender = new EmailSender();
MessageSender smsSender = new SMSSender();
MessageSender weChatSender = new WeChatSender();
Message normalMsgViaEmail = new NormalMessage(emailSender);
Message urgentMsgViaSMS = new UrgentMessage(smsSender);
Message urgentMsgViaWeChat = new UrgentMessage(weChatSender);
normalMsgViaEmail.send("欢迎使用我们的系统!");
urgentMsgViaSMS.send("服务器 CPU 负载率过高!");
urgentMsgViaWeChat.send("数据库连接异常!");
}
}
优缺点
优点
1)解耦抽象和实现:在不改变抽象类的情况下,改变其实现类,反之亦然
2)符合开闭原则:可以在不修改现有代码的基础上,灵活地增加新的抽象层和实现层,便于扩展
缺点
1)不适合简单场景:对于那些抽象和实现之间变化不大的简单场景,使用桥接模式可能会显得过于复杂和冗余。此时,直接将抽象和实现合并在一起可能会更加高效和直观。
