千里之行,始于足下。——老子
桥接模式类似于生活中的桥梁,连接两岸,促进两岸的沟通,代码世界中,两个不相关的类想进行关联,强行关联往往会适得其反,正所谓强扭的瓜不甜,那么桥接模式就在中间充当媒婆的角色。
1. 桥接模式
定义
桥接模式也成为桥梁模式、接口模式或者柄体模式,是将抽象部分与它的具体实现部分分离,是他们都可以独立地变化
通过组合的方式建立两个类之间的联系,而不是继承
属于结构型模式。
适用场景
在抽象和具体实现之间需要增加更多的灵活性的场景
一个类存在两个(或多个)独立变化的维度,而这两个(或多个)维度都需要独立进行扩展
不希望使用继承,或因为多层继承导致系统类的个数剧增
优点
分离抽象部门以及具体实现部分
提高了系统的扩展性
符合开闭原则
符合合成复用原则
缺点
增加了系统的理解与设计难度
需要正确地识别系统中两个独立变化的维度
2. 桥接模式简单案例
今年报了个班拿了个PMP证书,就拿这个做个例子。一般网络课程有课程、笔记、视频等内容,课程有很多,笔记是跟着课程的,视频也是跟着课程的,我们用桥接模式来实现一下三者的关系。
public interface ICrouse {
}
public class JavaCrouse implements ICrouse {
}
public class PythonCrouse implements ICrouse {
}
public interface INote {
void edit();
}
public class JavaNote implements INote {
public void edit() {
}
}
public class PythonNote implements INote {
public void edit() {
}
}
public interface IVideo {
}
public class JavaVideo implements IVideo {
}
public class PythonVideo implements IVideo {
}
先来看看类图

课程,笔记,视频是没有任何关系的,想要拉上关系,那么课程就要实现笔记和视频的接口,这显然不太合理,接口很多就没办法了。用桥接模式改造一下:
public abstract class AbstractCrouse implements ICrouse{
private INote note;
private IVideo video;
public void setNote(INote note) {
this.note = note;
}
public void setVideo(IVideo video) {
this.video = video;
}
}
public class JavaCrouse extends AbstractCrouse {
}
public class PythonCrouse extends AbstractCrouse {
}
再来看看类图

通过AbstractCrouse抽象类,作为桥梁,和笔记视频关联上了。这就是桥接模式。
3. 桥接模式复杂案例

一个系统内的消息有三种类别,每种消息的紧急程度有三种,那么这种组合就有9种。用桥接模式的写法:
public interface IMessage {
void sendMsd(String msg, String to);
}
public class MailMessage implements IMessage {
public void sendMsd(String msg, String to) {
System.out.println("给" + to + "发送邮件,邮件内容:" + msg);
}
}
public class SmsMessage implements IMessage {
public void sendMsd(String msg, String to) {
System.out.println("给" + to + "发送短信,短信内容:" + msg);
}
}
public class SysInnerMessage implements IMessage {
public void sendMsd(String msg, String to) {
System.out.println("给" + to + "发送系统内部消息,消息内容:" + msg);
}
}
public abstract class AbstractMessage {
private IMessage message;
public AbstractMessage(IMessage message) {
this.message = message;
}
void sendMessage(String message, String to) {
this.message.sendMsd(message, to);
}
}
public class NormalMessage extends AbstractMessage {
public NormalMessage(IMessage message) {
super(message);
}
@Override
void sendMessage(String message, String to) {
message = "[普通]" + message;
super.sendMessage(message, to);
}
}
public class UrgencyMessage extends AbstractMessage{
public UrgencyMessage(IMessage message) {
super(message);
}
@Override
void sendMessage(String message, String to) {
message = "[加急]" + message;
super.sendMessage(message, to);
}
}
public class Test {
public static void main(String[] args) {
IMessage message = new MailMessage();
AbstractMessage abstractMessage = new NormalMessage(message);
abstractMessage.sendMessage("测试邮件","Tom");
message = new SmsMessage();
abstractMessage = new UrgencyMessage(message);
abstractMessage.sendMessage("测试邮件","Tom");
}
}
给Tom发送邮件,邮件内容:[普通]测试邮件
给Tom发送短信,短信内容:[加急]测试邮件

4. JDBC中的桥接模式
JAVA中有一套专门的操作数据库的接口,在java.sql包下,为什么只写接口,不写实现呢?因为数据库厂商太多,每个厂商的标准又不一样,那么全部实现也不现实。所以Java就自己定义了一套操作数据库的接口,由每个数据库厂商自己去实现自己的数据库操作包,比如mysql的mysql-connector-java等,那么如何做对接呢?Java做了一个DriverManager类作为桥梁,去对接各个数据库驱动。这里就用到了桥接模式,有兴趣的可以看下DriverManager的源码。
感谢您阅读本文,如果您觉得文章写的对您有用的话,请您点击上面的“关注”,点个赞,这样您就可以持续收到《JAVA架构师之路》的最新文章了。文章内容属于自己的一点点心得,难免有不对的地方,欢迎在下方评论区探讨,你们的关注是我创作优质文章的动力。
桥接模式是一种结构型设计模式,用于分离抽象部分与其实现部分,提高系统的扩展性。通过组合而非继承实现两者间的关联。本文介绍了桥接模式的概念、适用场景、优缺点,并通过网络课程和消息类别的案例详细阐述了桥接模式的使用,最后探讨了JDBC中桥接模式的应用。

1483

被折叠的 条评论
为什么被折叠?



