第九章结构性模式—桥接模式

桥接模式是一种结构型设计模式,用于将抽象部分与实现部分分离,使它们可以独立变化。文章通过视频播放器的例子展示了如何使用桥接模式处理不同操作系统和多种视频格式的跨平台播放问题,以减少类的数量和提高灵活性,避免类爆炸的情况。桥接模式利用组合而不是继承来降低抽象和实现之间的耦合度。
摘要由CSDN通过智能技术生成


结构型模式描述如何将类或对象按某种布局组成更大的结构,有以下两种:

  • 类结构型模式:采用继承机制来组织接口和类。
  • 对象结构型模式:釆用组合或聚合来组合对象。

由于组合关系或聚合关系比继承关系耦合度低,满足 “合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。

结构型模式分为以下 7 种:

  • 代理模式
  • 适配器模式
  • 装饰者模式
  • 桥接模式
  • 外观模式
  • 组合模式
  • 享元模式

桥接模式

解决的问题

现在有一个需求,需要创建不同的图形,并且每个图形都有可能会有不同的颜色。我们可以利用继承的方式来设计类的关系:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jxd52ZGc-1684162815267)(C:\Users\lsc07\Desktop\学习资料\19typora笔记\15设计模式\第九章结构性模式—桥接模式.assets\image-20200207194617620.png)]

我们可以发现有很多的类,假如我们再增加一个形状或再增加一种颜色,就需要创建更多的类。

试想,在一个有多种可能会变化的维度的系统中,用继承方式会造成类爆炸,扩展起来不灵活。每次在一个维度上新增一个具体实现都要增加多个子类。为了更加灵活的设计系统,我们此时可以考虑使用桥接模式。

  • 其本质是使用了组合来代替继承,满足我们的合成复用原则
  • 这里桥接模式跟其装饰者模式很像,但是又有不同的,桥接模式更注重的是多个维度的变化,比如这里的需求我们的图形和颜色都会发生变化,所以对应着两个维度的变化
    • 对比我们装饰者举的例子,我们的快餐有炒饭和炒面,假如我们只做这个炒饭和炒面,那么我们唯一变得维度就是我们的配料

概念

桥接模式:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。

结构

桥接(Bridge)模式包含以下主要角色:

  • 抽象化(Abstraction)角色 :定义抽象类,并包含一个对实现化对象的引用。
  • 扩展抽象化(Refined Abstraction)角色 :抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
  • 实现化(Implementor)角色 :定义实现化角色的接口,供扩展抽象化角色调用。
  • 具体实现化(Concrete Implementor)角色 :给出实现化角色接口的具体实现。

实例

视频播放器

需要开发一个跨平台视频播放器,可以在不同操作系统平台(Windows、Mac、Linux 等)上播放多种格式的视频文件,常见的视频格式包括 RMVB、AVI、WMV 等,该播放器包含了两个维度,适合使用桥接模式。

两个维度是指:不同操作系统、不同的视频格式,这些都有可能任意变化

image-20230504172726891

实现化角色:视频文件格式接口

public interface VideoFile {
    //解码功能
    void decode(String fileName);
}

具体实现化角色:具体的视频文件类,avi、rmvb 等

public class AviFile implements VideoFile{
    @Override
    public void decode(String fileName) {
        System.out.println("avi视频文件 :" + fileName);
    }
}
public class RmvbFile implements VideoFile{
    @Override
    public void decode(String fileName) {
        System.out.println("rmvb视频文件 :" + fileName);
    }
}

抽象化角色:操作系统抽象类

public abstract class OperatingSystem {
    //声明videFile
    protected VideoFile videoFile;

    public OperatingSystem(VideoFile videoFile) {
        this.videoFile = videoFile;
    }
    public abstract void play(String fileNmae);
}

拓展抽象化角色:Windows、Mac 操作系统

public class Windows extends  OperatingSystem{
    public Windows(VideoFile videoFile) {
        super(videoFile);
    }

    @Override
    public void play(String fileNmae) {
        videoFile.decode(fileNmae);
    }
}
public class Mac extends OperatingSystem{
    public Mac(VideoFile videoFile) {
        super(videoFile);
    }

    @Override
    public void play(String fileNmae) {
        videoFile.decode(fileNmae);
    }
}

测试

public class Client {
    public static void main(String[] args) {
        // 创建Mac系统对象
        OperatingSystem system = new Mac(new AviFile());
        // 使用操作系统播放视频文件
        system.play("战狼3");
    }
}

使用场景

  • 当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。

  • 当一个系统不希望使用继承或因为多层次继承导致出现 “类爆炸” 的情况时。

    • 类爆炸:类的个数急剧增加
  • 当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。

  • 避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

库里不会投三分

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

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

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

打赏作者

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

抵扣说明:

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

余额充值