当前位置: 首页 > news >正文

设计模式(十三)----结构型模式之桥接模式

1 概述

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

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

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

定义:

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

2 结构

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

  • 抽象化(Abstraction)角色 :定义抽象类,并包含一个对实现化对象的引用。下面中的OperatingSystem

  • 扩展抽象化(Refined Abstraction)角色 :是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。

  • 实现化(Implementor)角色 :定义实现化角色的接口,供扩展抽象化角色调用。下面中的VidoeFile接口

  • 具体实现化(Concrete Implementor)角色 :给出实现化角色接口的具体实现。

3 案例

【例】视频播放器

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

类图如下:

代码如下:

//视频文件   实现化角色
public interface VideoFile {void decode(String fileName);
}
​
//avi文件  具体实现化角色
public class AVIFile implements VideoFile {public void decode(String fileName) {System.out.println("avi视频文件:"+ fileName);}
}
​
//rmvb文件  具体实现化角色
public class REVBBFile implements VideoFile {
​public void decode(String fileName) {System.out.println("rmvb文件:" + fileName);}
}
​
//操作系统版本  抽象角色
public abstract class OperatingSystemVersion {
​protected VideoFile videoFile;
​public OperatingSystemVersion(VideoFile videoFile) {this.videoFile = videoFile;}
​public abstract void play(String fileName);
}
​
//Windows版本  扩展抽象化角色
public class Windows extends OperatingSystem {
​public Windows(VideoFile videoFile) {super(videoFile);}
​public void play(String fileName) {videoFile.decode(fileName);}
}
​
//mac版本  扩展抽象化角色
public class Mac extends OperatingSystemVersion {
​public Mac(VideoFile videoFile) {super(videoFile);}
​public void play(String fileName) {videoFile.decode(fileName);}
}
​
//测试类
public class Client {public static void main(String[] args) {OperatingSystem os = new Windows(new AVIFile());os.play("战狼3");}
}

好处:

  • 桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。

    如:如果现在还有一种视频文件类型wmv,我们只需要再定义一个类实现VideoFile接口即可,其他类不需要发生变化。

  • 实现细节对客户透明

4 使用场景

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

  • 当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。

  • 当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。

http://www.lryc.cn/news/23028.html

相关文章:

  • 倾向得分匹配案例分析
  • 基于SpringCloud的可靠消息最终一致性04:项目基础代码
  • 操作系统权限提升(十八)之Linux提权-内核提权
  • 华为OD机试真题Java实现【快递运输】真题+解题思路+代码(20222023
  • java面试题-JVM问题排查
  • 市场上有很多低代码开发平台,不懂编程的人可以用哪些?
  • Tina_Linux打包流程说明指南_new
  • JVM面试题
  • @FeignClient注解
  • 一文搞懂如何在 React 中使用 防抖(Debounce)和 节流(Throttle)
  • Airbyte API
  • vue项目使用Electron开发桌面应用
  • std::chrono笔记
  • 接收arp请求并发送回应的实例
  • 【高性能计算】TVM使用TE手动优化矩阵乘法算法解析与代码解读
  • 消息中间件的概念
  • 窃密恶意软件Raccoon最新样本Stealer v2分析
  • 足球俱乐部管理系统
  • 2023上半年数学建模竞赛汇总(比赛时间、难易程度、含金量、竞赛官网)
  • 【python学习笔记】:PHP7 Null合并运算符
  • 数据结构与算法——3.时间复杂度分析1(概述)
  • FPGA学习之日常工作复位电路
  • 【洛谷 P1177】【模板】快速排序 题解(快速排序+指针)
  • Pthon--自动化实用技巧篇--文件目录处理
  • 想招到实干派程序员?你需要这种面试法
  • cesium常见操作:鼠标点击获取对象
  • 【玩转c++】git的安装和使用以及可视化处理
  • 第三阶段02-Mybatis框架
  • 基于超像素的多视觉特征图像分割算法研究
  • mysql的三大日志