设计模式02-桥接模式(Java)

4.2 桥接模式

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

2.结构:

  • 抽象化角色 :定义抽象类,并包含一个对实现化对象的引用。

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

  • 实现化角色 :定义实现化角色的接口,供扩展抽象化角色调用。

  • 具体实现化角色 :给出实现化角色接口的具体实现。

3.原理分析:

  • 桥接模式使用了开闭原则,里氏代换原则,依赖倒转原则。
  • 脱耦:将抽象化与实现化直接的耦合解脱开,将它们之间的强关联转化为弱关联,将两个角色之间的继承关系转化为关联关系。
apl 复制代码
抽象化:对象的共同属性抽出来形成的类
实现化:针对抽象化给出具体的实现

4.代码模板:

java 复制代码
public interface Implementor {
    public void operationImpl();
}

public abstract class Abstraction {
    protected Implementor implementor;
    public void setImplementor(Implementor implementor) {
        this.implementor = implementor;
    }
    public abstract void operation();
}

public class RefindedAbstraction extends Abstraction {
    @Override
    public void operation() {
        implementor.operationImpl();
    }
}

5.案例说明:

  • 类图:
  • Java代码实现

抽象类:对OS视频进行扩展

java 复制代码
public abstract class OSVersion {
    protected VideoFile videoFile;
    public void setVideoFile(VideoFile videoFile) {
        this.videoFile = videoFile;
    }
    public abstract void play(String fileName);
}

抽象类实现:

JAVA 复制代码
public class LinuxVersion extends OSVersion{
    @Override
    public void play(String fileName) {
        videoFile.decode("Linux", fileName);
    }
}

public class WindowsVersion extends OSVersion{
    @Override
    public void play(String fileName) {
        videoFile.decode("Windows", fileName);
    }
}

实现类接口:进行视频播放格式的扩展

java 复制代码
public interface VideoFile {
    public void decode(String osType, String fileName);
}

具体的实现类:

java 复制代码
public class MPEGFile implements VideoFile{
    @Override
    public void decode(String osType, String fileName) {
        System.out.println("位于" + osType + "操作系统的" + fileName + ".MPEG文件进行播放");
    }
}

public class WMVFile implements VideoFile{
    @Override
    public void decode(String osType, String fileName) {
        System.out.println("位于" + osType + "操作系统的" + fileName + ".WMV文件进行播放");
    }
}

Main函数

java 复制代码
public class Main {
    public static void main(String[] args) {
        WMVFile wmvFile = new WMVFile();
        WindowsVersion windowsVersion = new WindowsVersion();
        windowsVersion.setVideoFile(wmvFile);
        windowsVersion.play("刺客五六七");

        MPEGFile mpegFile = new MPEGFile();
        LinuxVersion linuxVersion = new LinuxVersion();
        linuxVersion.setVideoFile(mpegFile);
        linuxVersion.play("喜羊羊与灰太狼");
    }
}

6.桥接模式的优点

  • 实现了对抽象和实现之间的解耦

  • 优化了类直接多继承的

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

  • 实现细节对客户透明,可以对用户隐藏抽象细节

  • (缺点)难以识别要区分的两个独立变化的维度

7.桥接模式的使用场景

  • 当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。
  • 当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。
  • 当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。

8.桥接模式应用

  • Java应用程序通过虚拟机对其底层指令集抽象,针对不同的OS平台依赖不同的虚拟机实现跨平台
  • JDBC驱动程序是抽象,各个数据库是实现类型

9.桥接模式的拓展

在使用关联关系是,及在抽象类引入实现类接口时可能会出现不适配的情况,这是可以用适配器类型将其转换成抽象类可以适配的类进行关联。

相关推荐
专注API从业者2 分钟前
Open Claw 京东商品监控选品实战:一键抓取、实时监控、高效选品
java·服务器·数据库
摇滚侠19 分钟前
DBeaver 导入数据库 导入 SQL 文件 MySQL 备份恢复
java·数据库·mysql
keep one's resolveY43 分钟前
SpringBoot实现重试机制的四种方案
java·spring boot·后端
天空属于哈夫克31 小时前
企业微信API常见的错误和解决方案
java·数据库·企业微信
摇滚侠2 小时前
VMvare 虚拟机 Oracle19c 安装步骤,远程连接 Oracle19c,百度网盘安装包
java·oracle
梁萌2 小时前
idea报错找不到XX包的解决方法
java·intellij-idea·启动报错·缺少包
Agent产品评测局2 小时前
生产排期与MES/ERP系统打通,实操方法详解 —— 2026企业级智能体自动化选型与实战指南
java·运维·人工智能·ai·chatgpt·自动化
阿丰资源3 小时前
基于Spring Boot的电影城管理系统(直接运行)
java·spring boot·后端
呱牛do it3 小时前
企业级门户网站设计与实现:基于SpringBoot + Vue3的全栈解决方案(Day 8)
java
消失的旧时光-19434 小时前
Spring Boot 工程化进阶:统一返回 + 全局异常 + AOP 通用工具包
java·spring boot·后端·aop·自定义注解