Java 设计模式之桥接模式

作者: adm 分类: java 发布时间: 2022-08-09

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

主要角色:

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

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

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

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

二、代码实现
举例:比如当前要开发一款跨平台播放器,Windows,Linux,要求可以播放Mp4和Avi格式的视频,其中操作系统和视频格式就是上面所说的两个可变维度,一个是操作系统,一个是视频格式,他是两个不同的维度。接下来看代码实现。

实现化角色(播放器)

public interface VideoPlayer {
    void playVideo(String name);
}

具体实现化角色(Mp4播放器)

public class Mp4Player implements VideoPlayer {
    @Override
    public void playVideo(String name) {
        System.out.println(name+"播放Mp4");
    }
}

具体实现化角色(Avi播放器)

public class AviPlayer implements VideoPlayer{
    @Override
    public void playVideo(String name) {
        System.out.println(name+"播放Avi");
    }
}

抽象化角色(操作系统)

public abstract class MySystem {
    protected VideoPlayer player;//持有实现化对象

    public MySystem(VideoPlayer player) {
        this.player = player;
    }

    public abstract void play();
}

扩展抽象化角色(Windows系统)

public class Windows extends MySystem {

    public Windows(VideoPlayer player) {
        super(player);
    }

    @Override
    public void play() {
        player.playVideo("Windows");
    }
}

扩展抽象化角色(Linux系统)

public class Linux extends MySystem {

    public Linux(VideoPlayer player) {
        super(player);
    }

    @Override
    public void play() {
        player.playVideo("Linux");
    }
}

使用:

public static void main(String[] args) {
        //创建Windows系统
        MySystem windows = new Windows(new Mp4Player());
        windows.play();

        MySystem windows1 = new Windows(new AviPlayer());
        windows1.play();

        //创建Linux系统
        MySystem linux = new Linux(new Mp4Player());
        linux.play();

        MySystem linux1 = new Linux(new AviPlayer());
        linux1.play();
    }

输出:

Windows播放Mp4
Windows播放Avi
Linux播放Mp4
Linux播放Avi

桥接模式提高了系统的扩展性,可以在两个维度中任意扩展,不需要修改原有系统,拿上面的例子来说 如果要播放Wmv格式的视频,那么只需要定义一个Wmv类来实现实现化角色即可。符合开闭原则。

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!