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

文章目录

0、背景

现要创建不同的图形,图形的形状有圆、长方形、正方形,且它们有不同的颜色

两个维度在变,使用类的继承可以实现,也符合开闭原则,但会类爆炸。

1、模式

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

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

2、案例

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

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

java 复制代码
//视频文件
public interface VideoFile {
    void decode(String fileName);   //解码播放
}

写视频文件的实现类(具体的实现化角色)

java 复制代码
//avi文件
public class AVIFile implements VideoFile {
    public void decode(String fileName) {
        System.out.println("avi视频文件:"+ fileName);
    }
}
java 复制代码
//rmvb文件
public class REVBBFile implements VideoFile {

    public void decode(String fileName) {
        System.out.println("rmvb文件:" + fileName);
    }
}

定义抽象操作系统类(抽象化角色),聚合实现化角色

java 复制代码
//操作系统版本
public abstract class OperatingSystemVersion {

    protected VideoFile videoFile;  //聚合实现化角色

    public OperatingSystemVersion(VideoFile videoFile) {
        this.videoFile = videoFile;
    }

    public abstract void play(String fileName);  //播放视频文件的方法
}

写扩展抽象化角色:

java 复制代码
//Windows版本
public class Windows extends OperatingSystem {

    public Windows(VideoFile videoFile) {
        super(videoFile);
    }

    public void play(String fileName) {
        videoFile.decode(fileName);
    }
}
java 复制代码
//mac版本
public class Mac extends OperatingSystemVersion {

    public Mac(VideoFile videoFile) {
        super(videoFile);
    }

    public void play(String fileName) {
		videoFile.decode(fileName);
    }
}

测试:

java 复制代码
//测试类
public class Client {
    public static void main(String[] args) {
        OperatingSystem os = new Windows(new AVIFile());
        os.play("电影.avi");
    }
}

3、使用场景

  • 一个类存在两个独立变化的维度,且这两个维度都需要扩展
  • 避免两个层次之间建立静态的继承联系,可用桥接模式来建立一个关联关系
相关推荐
youdexiang3 小时前
AI 生成会议纪要好用吗?多款 APP 功能分析
java·人工智能·音视频
通信瓦工4 小时前
OCP 冷却环境与冷却剂分配单元(CDU)子项目
java·开发语言
Cc.Y5 小时前
Java零基础入门:类与对象深度掌握 —— 从“零散变量“到“打包管理“
java·开发语言·python
\光辉岁月/5 小时前
2.java变量
java·开发语言·变量
Wang's Blog5 小时前
Java 项目实战: 外卖平台优化-前端dist部署与Nginx反向代理rewrite
java·前端·nginx
专业程序开发源5 小时前
springboot生命故事书制作小程序65290-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·mysql·小程序·课程设计
代码山河5 小时前
Java的前世今生:从Oak语言到Java 23的发展史
java·学习·架构·教程·面向对象·项目
vx_Biye_Design5 小时前
springboot角色扮演服务平台65161-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·spring·课程设计
李游Leo5 小时前
HarmonyOS 7 QuickDock 闪控窗开发实录 02:floatView × floatingBall:形态切换、位置恢复与单一状态源【鸿蒙心迹】
java·华为·harmonyos
企业数字化笔记5 小时前
视频局部合成怎么做得自然?掩膜修复、边缘羽化、时序稳定与背景替换
java·javascript·音视频