【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、使用场景

  • 一个类存在两个独立变化的维度,且这两个维度都需要扩展
  • 避免两个层次之间建立静态的继承联系,可用桥接模式来建立一个关联关系
相关推荐
蓝斯4977 小时前
[原创]《C#高级GDI+实战:从零开发一个流程图》第章:增加贝塞尔曲线,上、下、左、右连接点
java·c#·流程图
前端工作日常7 小时前
我学习到的Java 的 Service 分层:itf 和 impl 到底是什么?
java·后端
都叫我大帅哥8 小时前
Spring @Transactional 注解完全指南
java·spring
Java成神之路-8 小时前
G1 垃圾回收器 :SATB + TAMS核心机制深度解析
java·jvm
前端工作日常8 小时前
我学习到的JIT即时编译与机器码缓存失效
java·后端
带刺的坐椅8 小时前
Solon 的 10 种 HTTP 服务器:改一行依赖,换一个引擎
java·solon·jetty·undertow·mcp-server·htttp
xcLeigh9 小时前
Go入门:变量声明的五种方式详解
java·开发语言·golang
AI大模型-小华9 小时前
Codex 三方充值快速入门指南
java·前端·数据库·chatgpt·ai编程·codex·chatgpt pro
Mark_ZP10 小时前
【锁1】Synchronized vs ReentrantLock区别
java
啦啦啦啦啦zzzz10 小时前
工具:动态类工厂和用配置文件存储属性
c++·设计模式·工具·动态工厂