【Java设计模式】九、桥接模式

news/2024/4/28 21:32:12

文章目录

  • 0、背景
  • 1、模式
  • 2、案例
  • 3、使用场景

0、背景

现要创建不同的图形,图形的形状有圆、长方形、正方形,且它们有不同的颜色
在这里插入图片描述
两个维度在变,使用类的继承可以实现,也符合开闭原则,但会类爆炸。

1、模式

将抽象与实现分离,使它们可以独立变化,用组合代替继承,将两部分连接起来。主要包括以下角色:

  • 抽象化角色:抽象类,聚合实现化角色
  • 扩展抽象化角色:抽象化角色的子类,通过组合关系调用实现化角色中的业务方法
  • 实现化角色:定义接口与方法,供扩展抽象化角色调用
  • 具体实现化角色:实现化角色中方法的具体实现

2、案例

开发一个跨操作系统的视频播放器,操作系统要支持Windows和Mac,视频格式要支持AVI和RMVB格式。这是两个维度的变化,可用桥接模式。

在这里插入图片描述

定义视频文件类(实现化角色)

//视频文件
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("电影.avi");}
}

3、使用场景

  • 一个类存在两个独立变化的维度,且这两个维度都需要扩展
  • 避免两个层次之间建立静态的继承联系,可用桥接模式来建立一个关联关系

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.cpky.cn/p/10423.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

【YOLOv9】训练模型权重 YOLOv9.pt 重新参数化轻量转为 YOLOv9-converted.pt

【YOLOv9】训练模型权重 YOLOv9.pt 重新参数化轻量转为 YOLOv9-converted.pt 1. 模型权重准备2. 模型重新参数化2.1 文件准备2.2 参数修改2.3 重新参数化过程 3. 重新参数化后模型推理3.1 推理超参数配置3.2 模型推理及对比 4. onnx 模型导出(补充内容)4…

UI设计达人都在用的在线工具大揭密

特别是在当今的UI设计领域,如果没有合适的UI设计工具,那么无论你的创作能力有多强,工作都会受到限制,但许多软件需要会员使用,这不适合第一个工作场所的设计师,所以有在线UI设计工具吗?关于这个…

Linux:kubernetes(k8s)探针ReadinessProbe的使用(9)

本章yaml文件是根据之前文章迭代修改过来的 先将之前的pod删除,然后使用下面这个yaml进行生成pod apiVersion: v1 # api文档版本 kind: Pod # 资源对象类型 metadata: # pod相关的元数据,用于描述pod的数据name: nginx-po # pod名称labels: # pod的标…

2024鸿蒙迎来大爆发,有必要转行鸿蒙开发吗?

鸿蒙开发,这个名字最近在科技圈引起了不小的轰动。 那么,鸿蒙开发到底是什么呢?它又能给我们带来怎样的影响呢? 鸿蒙开发,简单来说,就是基于鸿蒙操作系统的一种应用开发方式。鸿蒙系统,作为华为…

uniapp:音乐播放器

功能要求:全局音乐播放,可以上一首,下一首,暂停,播放。 1、mixins export default {data() {return {audio: null, // 音频对象playlist: [{url: require(../static/1.mp3)}, {url: require(../static/2.mp3)}, {url: …

论文阅读:Diffusion Model-Based Image Editing: A Survey

Diffusion Model-Based Image Editing: A Survey 论文链接 GitHub仓库 摘要 这篇文章是一篇基于扩散模型(Diffusion Model)的图片编辑(image editing)方法综述。作者从多个方面对当前的方法进行分类和分析,包括学习…