JAVA架构师之路十二:设计模式之桥接模式

桥接模式是一种结构型设计模式,用于分离抽象部分与其实现部分,提高系统的扩展性。通过组合而非继承实现两者间的关联。本文介绍了桥接模式的概念、适用场景、优缺点,并通过网络课程和消息类别的案例详细阐述了桥接模式的使用,最后探讨了JDBC中桥接模式的应用。

JAVA架构师之路十一:设计模式之适配器模式

千里之行,始于足下。——老子

桥接模式类似于生活中的桥梁,连接两岸,促进两岸的沟通,代码世界中,两个不相关的类想进行关联,强行关联往往会适得其反,正所谓强扭的瓜不甜,那么桥接模式就在中间充当媒婆的角色。

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就自己定义了一套操作数据库的接口,由每个数据库厂商自己去实现自己的数据库操作包,比如mysqlmysql-connector-java等,那么如何做对接呢?Java做了一个DriverManager类作为桥梁,去对接各个数据库驱动。这里就用到了桥接模式,有兴趣的可以看下DriverManager的源码。

感谢您阅读本文,如果您觉得文章写的对您有用的话,请您点击上面的“关注”,点个赞,这样您就可以持续收到《JAVA架构师之路》的最新文章了。文章内容属于自己的一点点心得,难免有不对的地方,欢迎在下方评论区探讨,你们的关注是我创作优质文章的动力。

JAVA架构师之路十三:设计模式之委派模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值