设计模式-桥接模式
·
设计模式-桥接模式
桥接模式,也叫作桥梁模式,英文是 Bridge Design Pattern。桥接模式的定义是“将抽象和实现解耦,让它们可以独立变化”。不过还有另外一种解释:“一个类存在两个(或多个)独立变化的维度,我们通过组合的方式,让这两个(或多个)维度可以独立进行扩展。”
案例分析
该模式的场景一般为多对多且能动态组合,例如一个监控告警系统,监控分为多个程度,例如严重、一般;告警分为多个方式,例如电话、邮箱、站内信。桥接模式结构如图:

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

这里的“抽象”和“实现”并不完全是指的并非“抽象类”或“接口”,而是被抽象出来的一套“类库”,它只包含骨架代码,真正的业务逻辑需要委派给定义中的“实现”来完成。而定义中的“实现”,也并非“接口的实现类”,而是的一套独立的“类库”。“抽象”和“实现”独立开发,通过对象之间的组合关系,组装在一起。
其实桥接模式在 JDBC、Java 日志系统中都有所体现,SLF4J 日志标准中,既有适配器模式,也有桥接模式。

更多推荐
所有评论(0)