设计模式-桥接模式

91 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

模式意图

在原先的类中扩展功能,与装饰者模式类似,但比装饰者模式简易,例如桥接模式中某个操作系统实现播放某个格式的音乐文件,而装饰者模式中炒饭里加鸡蛋,可以多次添加。

模式结构

抽象化角色

扩展抽象化角色

抽象实现化角色

具体实现化角色

应用实例

​编辑

开发一个跨平台播放器,可在Windows和Mac操作系统上播放多种格式的视频,即每个操作系统都能调用不同的视频文件。

桥接模式比较简单,就是将需要扩展的功能所共同实现的接口聚合到我们的类中,创建操作系统类时,将想要播放的视频对象传入赋值给成员变量。

​编辑

 

package mode;

public class Client {
    public static void main(String[] args) {
        OperatingSystem system = new Mac(new AviFile());
        system.play("喜羊羊");
    }
}

interface VideoFile{
    void decode(String fileName);
}
//具体实现化角色
class AviFile implements VideoFile{
    @Override
    public void decode(String fileName) {
        System.out.println("AviFile:"+fileName);
    }
}
//具体实现化角色
class RmvbFile implements VideoFile{
    @Override
    public void decode(String fileName) {
        System.out.println("RmvbFile:"+fileName);
    }
}

abstract class OperatingSystem{
    //声明videoFile变量
    protected VideoFile videoFile;

    public OperatingSystem(VideoFile videoFile){
        this.videoFile = videoFile;
    }
    public abstract void play(String fileName);
}
//扩展抽象化角色
class Windows extends OperatingSystem{
    public Windows(VideoFile videoFile) {
        super(videoFile);
    }

    @Override
    public void play(String fileName) {
        videoFile.decode(fileName);
    }
}
//扩展抽象化角色
class Mac extends OperatingSystem{
    public Mac(VideoFile videoFile) {
        super(videoFile);
    }

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

优点

提高系统扩展性,在两个变化维度中任意扩展一个维度不需要修改原有系统(扩展操作系统数量或者音乐文件格式的数量)

使用场景

  • 当一个类存在两个独立变化的维度且需要扩展时
  • 一个系统不希望使用继承扩展功能
  • 一个系统需要在构建的抽象化角色和具体角色之间增加更多灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使他们在抽象层建立一个关系关系