桥接模式

101 阅读4分钟

桥接模式

桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。 这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类,这两种类型的类可被结构化改变而互不影响。 桥接模式的目的是将抽象与实现分离,使它们可以独立地变化,该模式通过将一个对象的抽象部分与它的实现部分分离,使它们可以独立地改变。它通过组合的方式,而不是继承的方式,将抽象和实现的部分连接起来。


结构

  • 抽象化角色:定义抽象接口,通常包含对实现接口的引用。
  • 扩展抽象角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
  • 实现化角色:定义实现接口,给扩展抽象角色调用。
  • 具体实现化角色:实现化角色的具体实现类。

image.png

代码

package wnan.bridge;

/*****UTF-8*****
 * Description: 操作系统类 抽象化角色
 * Author: wnan
 * Create Date: 2024/10/3 21:00
 * Proverbs: 吃得苦中苦,方为人上人
 */
public abstract class OperatingSystem {
    protected VideoFile videoFile;
    public OperatingSystem(VideoFile videoFile) {
        this.videoFile = videoFile;
    }
    abstract void play(String fileName);
}
package wnan.bridge;

/*****UTF-8*****
 * Description: 扩展抽象化角色
 * Author: wnan
 * Create Date: 2024/10/3 21:05
 * Proverbs: 吃得苦中苦,方为人上人
 */
public class Windows extends OperatingSystem{
    public Windows(VideoFile videoFile) {
        super(videoFile);
    }
    @Override
    void play(String fileName) {
        System.out.println("Windows系统");
        videoFile.decode(fileName);
    }
}
package wnan.bridge;

/*****UTF-8*****
 * Description: 视频文件 实现化角色
 * Author: wnan
 * Create Date: 2024/10/3 17:42
 * Proverbs: 吃得苦中苦,方为人上人
 */
public interface VideoFile {
    void decode(String fileName);
}
package wnan.bridge;

/*****UTF-8*****
 * Description: av文件解码类 具体实现化角色
 * Author: wnan
 * Create Date: 2024/10/3 20:57
 * Proverbs: 吃得苦中苦,方为人上人
 */
public class AVFile implements VideoFile{
    @Override
    public void decode(String fileName) {
        System.out.println("解码av 文件:"+fileName);
    }
}
package wnan.bridge;

/*****UTF-8*****
 * Description: rm文件解码类 具体实现化角色
 * Author: wnan
 * Create Date: 2024/10/3 20:59
 * Proverbs: 吃得苦中苦,方为人上人
 */
public class RMFile implements VideoFile{
    @Override
    public void decode(String fileName) {
        System.out.println("解码rm文件"+fileName);
    }
}
package wnan.bridge;

/*****UTF-8*****
 * Description: 桥接模式
 * Author: wnan
 * Create Date: 2024/10/3 17:36
 * Proverbs: 吃得苦中苦,方为人上人
 */
public class Client {
    public static void main(String[] args) {
        OperatingSystem os=new Windows(new AVFile());
        os.play("huahua.av");

        OperatingSystem os1= new Windows(new RMFile());
        os1.play("huahua.rm");
    }
}
Windows系统
解码av 文件:huahua.av
Windows系统
解码rm文件huahua.rm

源码 design_pattern

分析

与桥接模式较为类似的模式包括:

  1. 适配器模式:

    适配器模式用于将一个类的接口转换成客户端所期望的另一个接口。适配器模式可以让原本由于接口不兼容而不能一起工作的那些类可以一起工作。虽然适配器模式和桥接模式都涉及到接口的转换或连接,但桥接模式的主要目的是将抽象与实现解耦,以便两者可以独立变化,而适配器模式则是为了兼容性,即让不同的接口能够协同工作。

  2. 策略模式:

    策略模式定义了一系列的算法,并将每一个算法封装起来,使它们可以互换。策略模式让算法的变化独立于使用算法的客户。虽然策略模式和桥接模式都能实现行为的动态切换,但是它们的目的不同。桥接模式关注的是如何将抽象与实现解耦,而策略模式则更注重于算法的封装和互换。

  3. 组合模式:

    组合模式允许将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。虽然组合模式和桥接模式都涉及到对象之间的组合,但是它们解决的问题点不同。组合模式强调的是构建树状结构,而桥接模式关注的是抽象与实现的分离。

应用场景: 当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。 当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。 当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。避免在两个层次之间。 建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。