设计模式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.桥接模式的拓展

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

相关推荐
浩瀚地学22 分钟前
【Java】JDK8的一些新特性
java·开发语言·经验分享·笔记·学习
XXOOXRT1 小时前
基于SpringBoot的加法计算器
java·spring boot·后端·html5
阿崽meitoufa1 小时前
JVM虚拟机:垃圾收集器和判断对象是否存活的算法
java·jvm·算法
我是苏苏2 小时前
C#高级:使用ConcurrentQueue做一个简易进程内通信的消息队列
java·windows·c#
一条闲鱼_mytube3 小时前
智能体设计模式(三)多智能体协作-记忆管理-学习与适应
人工智能·学习·设计模式
heartbeat..3 小时前
数据库基础知识体系:概念、约束、范式与国产产品
java·数据库·学习笔记·国产数据库
PXM的算法星球4 小时前
【操作系统】哲学家就餐问题实现详解
java
2301_815357704 小时前
Java项目架构从单体架构到微服务架构的发展演变
java·微服务·架构
Ethan-D4 小时前
#每日一题19 回溯 + 全排列思想
java·开发语言·python·算法·leetcode