• 详解设计模式:桥接模式


    桥接模式(Bridge Pattern)也称为桥梁模式、接口模式或者柄体模式,有点像适配器模式,也是 GoF 的 23 种设计模式中的一种结构型设计模式。

    桥接模式 是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。

    ~

    本篇内容包括:关于桥接模式、桥接模式实现 Demo



    一、关于桥接模式

    1、关于桥接模式

    桥接模式(Bridge Pattern)也称为桥梁模式、接口模式或者柄体模式,有点像适配器模式,也是 GoF 的 23 种设计模式中的一种结构型设计模式。

    桥接模式 是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。

    2、关于桥接模式的构成

    外观模式主要包含四种角色:

    • 抽象化(Abstraction)角色: 该类持有一个对实现角色的引用,抽象角色中的方法需要实现角色来实现,抽象角色一般为抽象类(构造函数规定子类要传入一个实现对象);
    • 修正抽象(RefinedAbstraction)角色: Abstraction 的具体实现,对Abstraction 的方法进行完善和扩展;
    • 实现化(Implementor)角色: 确定实现维度的基本操作,提供给 Abstraction使用。该类一般为接口或者抽象类;
    • 具体实现(ConcreteImplementor)角色: Implementor 的具体实现;
    3、关于桥接模式的XML

    在这里插入图片描述

    4、关于桥接模式的应用场景

    当一个类内部具备两种或多种变化维度时,使用桥接模式可以解耦这些变化的维度,使高层代码架构稳定。桥接模式适用于以下几种业务场景:

    • 在抽象和具体实现之间需要增加更多的灵活性的场景
    • 一个类存在两个或多个独立变化的维度,而这两个或多个维度都需要独立进行扩展
    • 不希望使用继承,或因为多层继承导致系统类的个数剧增
    5、关于桥接模式的优缺点

    # 桥接模式的优点

    • 抽象与实现分离,扩展能力强
    • 符合开闭原则
    • 符合合成复用原则
    • 其实现细节对客户透明

    # 桥接模式的缺点

    • 由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,能正确地识别出系统中两个独立变化的维度,这增加了系统的理解与设计难度。

    二、桥接模式 Demo

    1、Demo 设计

    开发一个跨平台视频播放器,可以在不同操作系统平台(如 Windows、Mac、Linux 等)上播放多种格式的视频文件,常见的视频格式包括 RMVB、AVI、WMV 等。该播放器包含了两个维度,适合使用桥接模式。

    桥接模式DEMO
    2、Demo 实现

    # VideoFile 视频文件 Abstraction 角色

    /**
     * 视频文件
     **/
    public interface VideoFile {
        void decode(String fileName);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    # avi文件 / rmvb文件 RefinedAbstraction 角色

    /**
     * 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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    # OperatingSystem 操作系统 Implementor 角色

    /**
     * 操作系统
     **/
    public abstract class OperatingSystem {
    
        protected VideoFile videoFile;
    
        public OperatingSystem(VideoFile videoFile) {
            this.videoFile = videoFile;
        }
    
        public abstract void play(String fileName);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    # Windows / Mac ConcreteImplementor 角色

    /**
     * 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 OperatingSystem {
    
        public Mac(VideoFile videoFile) {
            super(videoFile);
        }
    
        public void play(String fileName) {
    		videoFile.decode(fileName);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    3、Demo 测试
    /**
     * 测试类
     **/
    public class Client {
        public static void main(String[] args) {
            OperatingSystem os = new Windows(new AVIFile());
            os.play("间谍过家家");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 相关阅读:
    微服务框架 SpringCloud微服务架构 10 使用Docker 10.2 镜像命令练习
    QT 通用算法可以在任何提供STL风格迭代器的容器类上使用
    Python的collections包中的双端队列deque
    ECharts实现数据可视化入门教程(超详细)
    JS常用事件,使用方法
    java基础运算符 之 逻辑运算符
    分组密码与高级加密标准(二)
    [编程题]数据库连接池 - 牛客网题解
    shell脚本
    超分辨率重建DRCN
  • 原文地址:https://blog.csdn.net/weixin_45187434/article/details/128119591