什么是桥接模式
桥接模式指的是为了避免接口与类之间的大量继承,不通过继承,而通过组合等其他方式搭建一个类似于桥之类的东西来实现不同维度的类之间的联系。
桥接模式案例
首先有一个信息接口,对于信息存在两个维度,一个是短信、邮件等信息类型,一种是紧急程度的维度,分为普通程度和紧急模式。
首先由一个信息的接口。
public interface IMessage {
//发送消息的内容和接收人
void send(String message,String toUser);
}
public class EmailMessage implements IMessage {
@Override
public void send(String message, String toUser) {
System.out.println("使用邮件消息发送"+ message + "给" + toUser);
}
}
public class SmsMessage implements IMessage {
@Override
public void send(String message, String toUser) {
System.out.println("使用短信消息发送"+ message + "给" + toUser);
}
}
那么要在另一个维度对接口进行修改,可以将接口通过构造方法传到一个抽象类中而非使用继承来创造桥梁。
public abstract class AbstractMessage {
private IMessage message;
public AbstractMessage(IMessage message) {
this.message = message;
}
void sendMessage(String message,String toUser){
this.message.send(message,toUser);
}
}
其他方法通过继承这个抽象类来实现组合桥接。
public class NormalMessage extends AbstractMessage{
public NormalMessage(IMessage message) {
super(message);
}
}
public class UrgencyMessage extends AbstractMessage {
public UrgencyMessage(IMessage message) {
super(message);
}
void sendMessage(String message, String toUser){
message = "【加急】" + message;
super.sendMessage(message,toUser);
}
public Object watch(String messageId){
return null;
}
}
这样通过组合的方式可以避免出现类似下面这样的代码而重复写多个交叉的类。
public class NormalEmailMessage extends AbstractMessage implements IMessage(){
}
测试案例
public class Test {
public static void main(String[] args) {
IMessage message = new SmsMessage();
AbstractMessage abstractMessage = new NormalMessage(message);
abstractMessage.sendMessage("加班申请","王总");
message = new EmailMessage();
abstractMessage = new UrgencyMessage(message);
abstractMessage.sendMessage("加班申请","王总");
}
}
测试结果
使用短信消息发送加班申请给王总
使用邮件消息发送【加急】加班申请给王总
上面的案例就是通过AbstractMessage 作为桥梁连接信息的方式和紧急程度两个维度的。
桥接模式使用场景
类似于JDBC就是典型的桥接模式.
Class.forName(driver)就是利用你反射初始化类的时候创建了一个DriverManager的桥接,一方面连接java的数据库实现,一方面连接不同的数据库的实现方式,使用非继承的方式实现了不同维度之间的关联。