一.内容说明
如果需要开发一个跨平台视频播放器,可以在不同操作系统平台(如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)桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性,如何正确识别两个独立维度也需要一定的经验积累。