二. 桥接模式

本文详细介绍了如何使用桥接模式设计一个能跨Windows、Linux和Unix的视频播放器,通过VideoFile接口和具体实现类(如MPEGFile、RMVBFile等)解耦,展示了面向对象设计原则的应用。
摘要由CSDN通过智能技术生成

一.内容说明

如果需要开发一个跨平台视频播放器,可以在不同操作系统平台(如Windows,Linux,Unix等)上播放多种格式的视频文件,常见的视频格式包括MPEG,RMVB,AVI,WMV等。现使用桥接模式设计该播放器。

二.设计类图

在这里插入图片描述

三.全部类代码

1.实现接口类VideoFile(视频文件类)

public interface VideoFile {
    void decode(String osType, String fileName);
}

VideoFile是实现类接口,其中定义了基本操作decode(),用于播放视频,在其子类中提供实现,它位于桥接模式的抽象层。

2.具体实现类MPEGFile(MPEG格式类)

public class MPEGFile implements VideoFile{
    @Override
    public void decode(String osType, String fileName) {
        System.out.println(osType + "MPEG格式" + fileName + ".");
    }
}

MPEGFile是实现了VideoFile接口的具体类,它实现了基本操作decode(),播放MPEG格式的视频。

3.具体实现类RMVBFile(RMVB格式类)

public class RMVBFile implements VideoFile {
    @Override
    public void decode(String osType, String fileName) {
        System.out.println(osType + "RMVB格式" + fileName + ".");
    }
}

RMVBFile也是实现了VideoFile接口的具体类,它实现了基本操作decode(),播放RMVB格式的视频。

4.具体实现类AVIFile(AVI格式类)

public class AVIFile implements VideoFile {
    @Override
    public void decode(String osType, String fileName) {
        System.out.println(osType + "AVI格式" + fileName + ".");
    }
}

AVIFile也是实现了VideoFile接口的具体类,它实现了基本操作decode(),播放AVI格式的视频。

5.具体实现类WMVFile(WMV格式类)

public class WMVFile implements VideoFile {
    @Override
    public void decode(String osType, String fileName) {
        System.out.println(osType + "WMV格式" + fileName + ".");
    }
}

WMVFile也是实现了VideoFile接口的具体类,它实现了基本操作decode(),播放WMV格式的视频。

6.抽象类OperatingSystemVersion(操作系统平台类)

public abstract class OperatingSystemVersion {
    protected VideoFile vf;
    public void setVideoFile(VideoFile vf){
        this.vf = vf;
    }
    public abstract void play(String fileName);
}

OperatingSystemVersion作为抽象类角色,它本身是一个抽象类,在OperatingSystemVersion中定义了一个VideoFile类型的对象,与VideoFile接口之间存在关联关系,在OperatingSystemVersion及其子类中可以调用在VideoFile接口中定义的方法。在OperatingSystemVersion中定义了抽象业务方法play(),在其子类中将实现该方法。

7.扩充抽象类WindowsVersion(Windows操作系统类)

public class WindowsVersion extends OperatingSystemVersion {
    @Override
    public void play(String fileName) {
        String osType = "Windows操作系统平台";
        this.vf.decode(osType, fileName);
    }
}

WindowsVersion是OperatingSystemVersion的子类,实现了在OperatingSystemVersion中定义的抽象方法play(),使用Windows操作系统平台播放视频文件。

8.扩充抽象类LinuxVersion(Linux操作系统类)

public class LinuxVersion extends OperatingSystemVersion {
    @Override
    public void play(String fileName) {
        String osType = "Linux操作系统平台";
        this.vf.decode(osType, fileName);
    }
}

LinuxVersion也是OperatingSystemVersion的子类,实现了在OperatingSystemVersion中定义的抽象方法play(),使用Linux操作系统平台播放视频文件。

9.扩充抽象类UnixVersion(Unix操作系统类)

public class UnixVersion extends OperatingSystemVersion {
    @Override
    public void play(String fileName) {
        String osType = "Unix操作系统平台";
        this.vf.decode(osType, fileName);
    }
}

UnixVersion也是OperatingSystemVersion的子类,实现了在OperatingSystemVersion中定义的抽象方法play(),使用Unix操作系统平台播放视频文件。

10.客户端测试类Client

public class Client {
    public static void main(String[] args) {
        OperatingSystemVersion wmvFile = new WindowsVersion();
        wmvFile.setVideoFile(new WMVFile());
        wmvFile.play("花样年华");
        OperatingSystemVersion rmvbFile = new LinuxVersion();
        rmvbFile.setVideoFile(new RMVBFile());
        rmvbFile.play("阿飞正传");
        OperatingSystemVersion aviFile = new UnixVersion();
        aviFile.setVideoFile(new AVIFile());
        aviFile.play("重庆森林");
        OperatingSystemVersion mpegFile = new WindowsVersion();
        mpegFile.setVideoFile(new MPEGFile());
        mpegFile.play("霸王别姬");
    }
}

四.运行结果

在这里插入图片描述

五.分析和总结

1.整体构造:桥接模式是一个非常有用的模式,体现了很多面向对象设计原则的思想,包括开闭原则,合成复用原则,里氏代换原则,依赖倒转原则等。桥接模式中蕴含了很多设计模式的关键思想,桥接模式可以从接口中分离实现功能,使得设计更具扩展性,这样,客户端代码在调用方法时不需要知道实现的细节。
2.优点:(1)分离抽象接口及其实现部分。桥接模式使用“对象间的关联关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化。所谓抽象和实现沿着各自维度的变化,也就是说抽象和实现不再在同一个继承层次结构中,而是“子类化”它们,使它们各自都具有自己的子类,以便任何组合子类,从而获得多维度组合对象。(2)在很多情况下,桥接模式可以取代多层继承方案,多层继承方案违背了“单一职责原则”,复用性较差,且类的个数非常多,桥接模式是比多层继承方案更好的解决方法,它极大减少了子类的个数。(3)桥接模式提高了系统的可扩展性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统,符合“开闭原则”。
3.缺点:(1)桥接模式的使用会增加系统的理解与设计难度,由于关联关系建立在抽象层,要求开发者一开始就针对抽象层进行设计与编程。
(2)桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性,如何正确识别两个独立维度也需要一定的经验积累。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值