前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【设计模式】桥接模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

【设计模式】桥接模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

作者头像
韩曙亮
发布2023-03-29 15:36:04
3K0
发布2023-03-29 15:36:04
举报
文章被收录于专栏:韩曙亮的移动开发专栏

文章目录

一、桥接模式简介


桥接模式 :

  • 分离抽象实现 : 将 抽象部分 与 它的 具体实现部分 分离 , 使它们 都可以 独立的 变化 ; 独立的变化 就是 在一定程度上 进行解耦 ;
  • 组合方式 : 通过 组合 的方式 建立 两个类 之间的联系 , 而 不是 继承 ;

桥接模式类型 : 结构型 ;

桥接模式 相当于 使用桥梁 将两侧连接起来 , 这里指的是 使用桥梁 连接两个类 , 在两个类之间建立某种联系 , 可以通过继承 , 也可以通过组合 , 桥接模式 是采用 组合的方式 , 建立两个类之间的关系 ; 合成复用原则 , 推荐优先使用组合 , 不是继承 ; 桥接模式 可以防止子类过多 , 造成系统复杂的情况 ;

桥接模式的重点 是 理解 类的 抽象部分 和 具体的实现部分 ;

  • 抽象过程 : 抽象部分 , 经过 抽象化 , 忽略某些信息 , 将不同的实体当做同一个对待 ; 面向对象中 , 将对象的共同性质抽取出来 , 形成类的过程 , 就是抽象化过程 ;
  • 实现过程 : 对于具体实现的部分 , 也要进行实现化 , 针对抽象化 , 给出具体实现 ; 这个过程就是实现过程 , 过程的产出就是具体实现部分 , 具体实现部分产生的对象 , 比抽象产生的更具体 , 是对抽象化事物的具体化产物 ;

如 : 开发跨平台的视频播放器 , 平台有 Android , iOS , Windows , Linux , Mac , 播放器支持的格式有 MP4 , AVI , RMVB , FLV 格式 ; 这种情况下 , 适合使用桥接模式 ;

二、桥接模式适用场景


桥接模式适用场景 :

  • 抽象实现灵活 : 抽象 和 具体实现 之间 , 需要 增加更多灵活性 的情况下 , 适合使用桥接模式 ; 使用 桥接模式 , 可以 避免在这两个层次之间 , 建立静态的继承关系 , 通过 桥接模式 在二者之间建立 关联关系 ; 抽象 和 实现 都可以 各自 以继承的方式扩展 , 互不影响 ; 可以动态的 将 抽象 的子类对象 和 实现 的子类对象 进行组合 , 在系统中 , 抽象 和 实现 之间进行了解耦 ;
  • 独立变化维度 : 一个类存在
2

个或更多的 独立变化维度 , 并且这些维度都需要 独立扩展 ; 抽象部分可以 独立扩展 , 具体实现的部分 , 也可以独立扩展 ;

  • 不使用继承 : 不希望使用继承 , 或 因多层继承导致系统类的个数增加 ;

三、桥接模式优缺点


桥接模式优点 :

  • 分离抽象与实现 : 分离 抽象部分 和 具体实现部分 ; 桥接模式 使用 组合关系 解耦了 抽象 和 实现 之间的继承关系 ; 抽象 和 实现 可以格子 沿着自己的维度进行扩展 ; 抽象 和 实现 不在同一个继承层次中 , 通过进行组合 , 可以获得多维度的组合对象 ;
  • 提高扩展型 : 提高了系统的 可扩展性 ; 解耦了 抽象 与 实现 , 二者可以继续进行扩展 , 不需要改变系统原有的功能 ;
  • 符合开闭原则 ;
  • 符合合成复用原则 ;

桥接模式缺点 :

  • 系统复杂 : 增加了 系统的 理解 与 设计难度 ;
  • 识别变化维度 : 需要正确地 识别出 系统中 , 两个独立变化的 维度 ;

桥接模式的使用范围 , 有一定的局限性 ;

四、桥接模式相关设计模式


桥接模式与组合模式 :

  • 组合模式 更强调 部分 与 整体间的组合 ;
  • 桥接模式 更强调 平行级别上 , 不同类的组合 ;

桥接模式与适配器模式 :

  • 共同点 : 都是让 两个类 配合工作 ;
  • 不同点 : 二者目的不同 ;
    • 适配器模式 是改变已有接口 , 让二者之间相互配合 ; 目的是配合 ;
    • 桥接模式 分离 抽象 和 具体 的实现 , 目的是分离 ;

五、桥接模式代码示例


业务逻辑场景 : 开发跨平台的视频播放器 , 平台有 Android , iOS , Windows , Linux , Mac , 播放器支持的格式有 MP4 , AVI , RMVB , FLV 格式 ; 这种情况下 , 适合使用桥接模式 ;

平台 : 播放器支持 Linux , Android 平台 ; 视频格式 : 播放器支持 MP4 , FLV 视频格式 ;

这里分为两块 , 一块是平台 , 一块是视频格式 ; 平台可以不断的扩展 , 如 : Windows , iOS , MAC , 嵌入式平台 ; 视频类型也可以不断的扩展 , 如 : H264 , H265 , MPEG 等 ; 二者可以随着自己的层级进行扩展 ;

桥接模式 最重要的是 将 抽象 与 实现 解耦 , 通过组合 在 抽象 与 实现 之间搭建桥梁 ;

1、视频格式抽象

代码语言:javascript
复制
package bridge;

public interface Vedio {
    /**
     * 打开视频
     *      可以打开 MP4 / FLV 格式视频
     *      视频 ( 格式 ) 是个 抽象
     * @return
     */
    Vedio openVedio();

    /**
     * 查看视频信息
     */
    void showVedio();
}

2、FLV 视频格式实现

代码语言:javascript
复制
package bridge;

/**
 * FLV 视频格式
 */
public class FlvVedio implements Vedio {
    @Override
    public Vedio openVedio() {
        System.out.println("打开 FLV 格式视频");
        return new FlvVedio();
    }

    @Override
    public void showVedio() {
        System.out.println("当前视频格式是 FLV");
    }
}

3、MP4 视频格式实现

代码语言:javascript
复制
package bridge;

/**
 * MP4 格式
 */
public class MP4Vedio implements Vedio {
    @Override
    public Vedio openVedio() {
        System.out.println("打开 MP4 格式视频");
        return new MP4Vedio();
    }

    @Override
    public void showVedio() {
        System.out.println("当前视频格式是 MP4");
    }
}

4、系统平台抽象

代码语言:javascript
复制
package bridge;

/**
 * 平台操作系统 抽象类
 */
public abstract class Platform {
    /**
     * 这是桥接模式最核心的代码
     *      在 Platform 中通过组合方式关联 Vedio
     *      Platform 的子类也可以关联 Vedio 子类
     */
    protected Vedio account;

    public Platform(Vedio account) {
        this.account = account;
    }

    /**
     * 该方法与 Vedio 中的方法名相同
     *      方法名相同不是强制的
     * @return
     */
    abstract Vedio openVedio();
}

5、Linux 系统平台实现

代码语言:javascript
复制
package bridge;

public class LinuxPlatform extends Platform {
    public LinuxPlatform(Vedio account) {
        super(account);
    }

    @Override
    Vedio openVedio() {
        System.out.println("在 Linux 平台播放视频");
        return account;
    }
}

6、Android 系统平台实现

代码语言:javascript
复制
package bridge;

public class AndroidPlatform extends Platform {
    public AndroidPlatform(Vedio account) {
        super(account);
    }

    @Override
    Vedio openVedio() {
        System.out.println("在 Android 平台打开视频");
        return account;
    }
}

7、测试类

代码语言:javascript
复制
package bridge;

public class Main {
    public static void main(String[] args) {
        // 在 Linux 平台打开 FLV 视频
        Platform linuxPlatform = new LinuxPlatform(new FlvVedio());
        Vedio linuxFlv = linuxPlatform.openVedio();
        linuxFlv.showVedio();

        System.out.println();

        // 在 Android 平台打开 MP4 视频
        Platform androidPlatform = new AndroidPlatform(new MP4Vedio());
        Vedio androidMp4 = androidPlatform.openVedio();
        androidMp4.showVedio();
    }
}

执行结果 :

代码语言:javascript
复制
在 Linux 平台播放视频
当前视频格式是 FLV

在 Android 平台打开视频
当前视频格式是 MP4
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-08-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、桥接模式简介
  • 二、桥接模式适用场景
  • 三、桥接模式优缺点
  • 四、桥接模式相关设计模式
  • 五、桥接模式代码示例
    • 1、视频格式抽象
      • 2、FLV 视频格式实现
        • 3、MP4 视频格式实现
          • 4、系统平台抽象
            • 5、Linux 系统平台实现
              • 6、Android 系统平台实现
                • 7、测试类
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档