桥接模式(Bridge Pattern)也称为桥梁模式、接口模式或者柄体(handle and body)模式,是将抽象部分与它的具体实现部分分离,使他们都可以独立地变化,属于结构型模式。
桥接模式主要目的:通过组合的方式建立两个类之间的联系,而不是继承。但又类似于多重继承方案,但是多重继承方案往往违背了类的单一职责原则,复用性比较差,桥接模式是比多重继承更好的替代方案。桥接模式的核心在于解耦抽象和实现。
优点:
1、分离抽象部分及其具体的实现部分
2、提高系统的扩展性
3、符合开闭原则
4、符合合成复用原则
缺点:
1、增加了系统的理解和设计难度
2、需要正确的识别系统中两个独立变化的维度
实战:例如发送消息,有发送的方式和消息的等级。具体的实现可以分为短信发送消息,邮件发送消息;
消息类型为抽象的:可以分为正常和加急
代码Demo如下:
public interface IMessage {
public void send(String message , String toUser);
}
public class EmailMessage implements IMessage{
@Override
public void send(String message, String toUser) {
System.out.println(String.format("使用邮件发送消息: %s 给 %s",message,toUser));
}
}
public class SmsMessage implements IMessage{
@Override
public void send(String message, String toUser) {
System.out.println(String.format("使用短信发送消息: %s 给 %s",message,toUser));
}
}
public abstract class AbstractMessage {
IMessage iMessage;
public AbstractMessage(IMessage iMessage) {
this.iMessage = iMessage;
}
//发送消息,委派给实现部分的方法
public void sendMessage(String message , String toUser){
this.iMessage.send(message,toUser);
}
}
public class NomalMessage extends AbstractMessage{
public NomalMessage(IMessage iMessage) {
super(iMessage);
}
@Override
public void sendMessage(String message, String toUser) {
//普通消息直接调用父类的方法
super.sendMessage(message, toUser);
}
}
public class UrgencyMessage extends AbstractMessage {
public UrgencyMessage(IMessage iMessage) {
super(iMessage);
}
@Override
public void sendMessage(String message, String toUser) {
message = "加急:" + message;
super.sendMessage(message, toUser);
}
}
在源码中的实现有JDBC的Driver类就是为桥接对象,在使用的时候我们需要通过Class.forName()通过放射的机制加载驱动类 方法去加载各个数据库厂商实现的Driver类
对应流程图如下: