【设计模式】桥接模式

本文介绍了桥梁模式的概念及其在软件设计中的应用。桥梁模式是一种结构型设计模式,用于将抽象与实现解耦,使得两者可以独立变化。文章通过JDBC驱动器和消息发送系统的实例,展示了如何利用桥梁模式实现组件之间的解耦。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设计模式总结链接


桥梁模式是对象的结构模式。又称为柄体(Handle and Body)模式接口(Interface)模式。桥梁模式的用意是“将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化”。


一。简解

桥接模式顾名思义,是在两个模块间搭的一个桥,这两个模块就是抽象化和实现
抽象由抽象类或者接口声明的,作为一类类的抽象
实现则是继承抽象类或者实现接口的类,用于做具体实现。


二。用途

桥接模式则是用来实现他们之间分离的一种手段,通常是桥接模式则是用来实现他们之间分离的一种手段,在加个setter方法,注入实现这种桥接的分离。


三。实例

JDBC有用到这种桥接模式:

 桥梁模式在Java应用中的一个非常典型的例子就是JDBC驱动器。JDBC为所有的关系型数据库提供一个通用的界面。一个应用系统动态地选择一个合适的驱动器,然后通过驱动器向数据库引擎发出指令。这个过程就是将抽象角色的行为委派给实现角色的过程。
  抽象角色可以针对任何数据库引擎发出查询指令,因为抽象角色并不直接与数据库引擎打交道,JDBC驱动器负责这个底层的工作。由于JDBC驱动器的存在,应用系统可以不依赖于数据库引擎的细节而独立地演化;同时数据库引擎也可以独立于应用系统的细节而独立的演化。两个独立的等级结构如下图所示,左边是JDBC API的等级结构,右边是JDBC驱动器的等级结构。应用程序是建立在JDBC API的基础之上的。
这里写图片描述

  应用系统作为一个等级结构,与JDBC驱动器这个等级结构是相对独立的,它们之间没有静态的强关联。应用系统通过委派与JDBC驱动器相互作用,这是一个桥梁模式的例子。
  JDBC的这种架构,把抽象部分和具体部分分离开来,从而使得抽象部分和具体部分都可以独立地扩展。对于应用程序而言,只要选用不同的驱动,就可以让程序操作不同的数据库,而无需更改应用程序,从而实现在不同的数据库上移植;对于驱动程序而言,为数据库实现不同的驱动程序,并不会影响应用程序。



一个通过不同设备通过不同方式发送信息的例子

类图如下:
这里写图片描述

抽象消息类:

public abstract class AbstractMessage {
    //持有一个实现部分的对象
    MessageImplementor impl;
    /**
     * 构造方法,传入实现部分的对象
     * @param impl  实现部分的对象
     */
    public AbstractMessage(MessageImplementor impl){
        this.impl = impl;
    }
    /**
     * 发送消息,委派给实现部分的方法
     * @param message    要发送消息的内容
     * @param toUser    消息的接受者
     */
    public void sendMessage(String message , String toUser){
        this.impl.send(message, toUser);
    }
}

普通消息类

public class CommonMessage extends AbstractMessage {

    public CommonMessage(MessageImplementor impl) {
        super(impl);
    }
    @Override
    public void sendMessage(String message, String toUser) {
        // 对于普通消息,直接调用父类方法,发送消息即可
        super.sendMessage(message, toUser);
    }
}

加急消息类

public class UrgencyMessage extends AbstractMessage {

    public UrgencyMessage(MessageImplementor impl) {
        super(impl);
    }
    @Override
    public void sendMessage(String message, String toUser) {
        message = "加急:" + message;
        super.sendMessage(message, toUser);
    }
    /**
     * 扩展自己的新功能,监控某消息的处理状态
     * @param messageId    被监控的消息编号
     * @return    监控到的消息的处理状态
     */
    public Object watch(String messageId) {
        // 根据消息id获取消息的状态,组织成监控的数据对象,然后返回
        return null;
    }
}

实现发送消息的统一接口

public interface MessageImplementor {
    /**
     * 发送消息
     * @param message 要发送消息的内容
     * @param toUser  消息的接受者
     */
    public void send(String message , String toUser);
}

系统内短消息的实现类

public class MessageSMS implements MessageImplementor {

    @Override
    public void send(String message, String toUser) {

        System.out.println("使用系统内短消息的方法,发送消息'"+message+"'给"+toUser);
    }

}

邮件短消息的实现类

public class MessageEmail implements MessageImplementor {

    @Override
    public void send(String message, String toUser) {
        System.out.println("使用邮件短消息的方法,发送消息'"+message+"'给"+toUser);
    }

}

客户端类

public class Client {

    public static void main(String[] args) {
        //创建具体的实现对象
        MessageImplementor impl = new MessageSMS();
        //创建普通消息对象
        AbstractMessage message = new  CommonMessage(impl);
        message.sendMessage("加班申请速批","李总");

        //将实现方式切换成邮件,再次发送
        impl = new MessageEmail();
        //创建加急消息对象
        message = new UrgencyMessage(impl);
        message.sendMessage("加班申请速批","李总");
    }

}

观察上面的例子会发现,采用桥梁模式来实现,抽象部分和实现部分分离开了,可以相互独立的变化,而不会相互影响。因此在抽象部分添加新的消息处理(特急消息),对发送消息的实现部分是没有影响的;反过来增加发送消息的方式(手机短消息),对消息处理部分也是没有影响的。


四。优点

桥接模式的优点不言而喻,那就是它强大的解耦能力,能够很好的实现抽象和实现的解耦,同时使用注入的方式,更加灵活。


五。不足

桥接模式只使用在某些情况下,比如,做某个操作,有诸多方式,此时桥接模式义不容辞,其余情况,不太适用。

<think>好的,用户想了解桥接设计模式的概念、实现、使用场景和示例。我需要先回忆一下桥接模式的基本知识,然后结合提供的引用内容来组织回答。 首先,桥接模式属于结构型设计模式,主要目的是将抽象部分实现部分分离,使它们可以独立变化。根据引用[^1],桥接模式适用于需要多维度变化的场景,比如不同的系统平台和不同的视频格式组合。我需要解释清楚这种分离的好处,比如提高扩展性,避免类爆炸。 接下来是概念部分。桥接模式通过组合代替继承,这样抽象层和实现层可以独立扩展。引用[^3]中的例子提到DrawingAPI接口作为实现部分,Shape作为抽象部分,这可以帮助说明结构。需要明确抽象化和实现化的定义,以及它们如何通过组合连接。 然后是实现步骤。根据引用[^1]的示例,抽象部分如视频格式和系统平台,具体实现如FLV、MP4和Linux、Android。步骤应包括定义抽象类、扩充抽象类、实现接口和具体实现类。代码示例可能来自引用[^2]或[^3],比如跨平台图像浏览系统,但用户提供的引用中有视频格式和系统平台的例子,应该用这个更贴切。 使用场景部分,引用提到桥接模式适用于多个维度的变化,比如不同平台和文件格式。需要列举类似的情况,如不同数据库和操作系统,或者不同通知类型和发送方式。这部分需要强调两个独立变化的维度,以及避免多层继承的问题。 优缺点方面,优点包括解耦、扩展性好,缺点可能增加系统复杂性。引用的优缺点部分可能有帮助,但用户提供的引用中没有详细说明,需要根据一般知识补充。 最后生成相关问题,需要围绕桥接模式的应用、其他模式的区别、实际案例等。参考用户之前的示例问题,可以问如何选择桥接模式其他模式,或者具体实现中的注意事项。 需要确保回答结构清晰,分点说明,并正确引用提供的资料。例如,在代码示例部分引用中的视频格式和系统平台实现,以及引用中的DrawingAPI示例。同时注意使用中文,数学公式用$...$,但这个问题中可能用不到数学公式,但还是要检查是否有需要的地方。 现在组织回答的结构:概念、实现步骤、使用场景、示例代码、优缺点,最后相关问题。确保每个部分都有引用支持,比如概念部分引用和,示例部分引用和。可能需要将引用内容自然地融入回答中,例如在提到示例时标注引用来源。</think>### 桥接设计模式详解 #### 一、概念 桥接模式(Bridge Pattern)是一种**结构型设计模式**,其核心思想是将**抽象部分****实现部分**分离,使两者能独立变化。通过组合关系替代继承关系,避免多层继承导致的类爆炸问题。 - **抽象化(Abstraction)**:定义高层控制逻辑,依赖实现部分的对象。 - **实现化(Implementor)**:定义底层具体操作的接口,供抽象部分调用。 例如,视频播放器需要支持不同格式(如FLV、MP4)和不同系统平台(如Linux、Android)。桥接模式可将格式抽象平台实现解耦,避免为每个组合创建独立类[^1]。 --- #### 二、实现步骤 1. **定义实现化接口**:声明底层操作(如系统平台的文件读取接口)。 2. **实现具体实现类**:针对不同平台(如Linux、Android)提供接口的具体实现。 3. **定义抽象化类**:包含对实现化接口的引用,定义高层逻辑(如视频格式解析)。 4. **扩展抽象化类**:细化抽象逻辑(如针对FLV、MP4格式的解析逻辑)。 **代码示例**(基于视频格式系统平台的场景): ```java // 1. 实现化接口:系统平台 interface SystemPlatform { void playVideo(String format); } // 2. 具体实现类:Linux平台 class LinuxPlatform implements SystemPlatform { public void playVideo(String format) { System.out.println("Linux播放" + format + "视频"); } } // 3. 抽象化类:视频格式抽象 abstract class VideoFormat { protected SystemPlatform platform; public VideoFormat(SystemPlatform platform) { this.platform = platform; } abstract void parse(); } // 4. 扩展抽象化类:FLV格式 class FLVFormat extends VideoFormat { public FLVFormat(SystemPlatform platform) { super(platform); } public void parse() { platform.playVideo("FLV"); } } ``` --- #### 三、使用场景 1. **多维度变化**:如同时支持不同文件格式和不同操作系统。 2. **避免继承层级过深**:当子类可能因组合关系爆炸时(如$M \times N$个组合)。 3. **运行时切换实现**:例如动态更换数据库驱动或图形渲染API。 --- #### 四、优缺点 - **优点** - 解耦抽象实现,提高扩展性 - 符合开闭原则,新增维度无需修改原有代码 - **缺点** - 增加系统复杂度,需预先设计抽象层次 --- #### 五、其他模式的关系 - **适配器模式**:适配器用于兼容已有接口,桥接模式用于设计阶段解耦[^2]。 - **抽象工厂模式**:抽象工厂可配合桥接模式创建不同实现的对象[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鼠晓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值