一、桥接模式
桥接模式(Bridge Pattern)是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。
定义:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
使用频率:3星
模式结构:
桥接(Bridge)模式包含以下主要角色:
1、抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。
2、扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
3、实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。
4、具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。
桥接模式结构图:
优点:
1、抽象与实现分离,扩展能力强
2、符合开闭原则
3、符合合成复用原则
4、其实现细节对客户透明
缺点:
1、由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,能正确地识别出系统中两个独立变化的维度,这增加了系统的理解与设计难度。
应用场景:
1、当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。
2、当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。
3、当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。
二、桥接模式实例之跨平台视频播放器
1.实例说明
如果需要开发一个跨平台视频播放器,可以在不同操作系统平台(如Windows、Linux、Unix等)上播放多种格式的视频文件,如MPEG、RMVB、AVI、WMV等常见视频格式。现使用桥接模式设计该播放器。
2.实例类图
3.实例代码
在本例中,OperationSystemVersion充当抽象类,其子类WindowsVersion、LinuxVersion和UnixVersion充当扩充抽象类;VideoFile充当抽象实现类,其子类MPEGFile、RMVBFile、AVIFile和WMVFile等充当具体实现类。
//抽象视频文件类:抽象实现类
interface VideoFile{
public void decode(String osType,String fileName);
}
//MPEG格式视频文件类:具体实现类
class MPEGFile implements VideoFile {
@Override
public void decode(String osType, String fileName) {
System.out.println("格式为MPEG的视频文件"+fileName+"在"+osType+"平台中解码播放");
}
}
//RMVB格式视频文件类:具体实现类
class RMVBFile implements VideoFile {
@Override
public void decode(String osType, String fileName) {
System.out.println("格式为RMVB的视频文件"+fileName+"在"+osType+"平台中解码播放");
}
}
//AVI格式视频文件类:具体实现类
class AVIFile implements VideoFile {
@Override
public void decode(String osType, String fileName) {
System.out.println("格式为AVI的视频文件"+fileName+"在"+osType+"平台中解码播放");
}
}
//WMV格式视频文件类:具体实现类
class WMVFile implements VideoFile {
@Override
public void decode(String osType, String fileName) {
System.out.println("格式为WMV的视频文件"+fileName+"在"+osType+"平台中解码播放");
}
}
///
//抽象播放器类:抽象类
abstract class OperationSystemVersion{
protected VideoFile vf;
public void setVideoFile(VideoFile vf){
this.vf = vf;
}
public abstract void play(String filename);
}
//Window播放器类:扩充抽象类
class WindowsVersion extends OperationSystemVersion{
@Override
public void play(String filename) {
vf.decode("Windows",filename);
}
}
//Linux播放器类:扩充抽象类
class LinuxVersion extends OperationSystemVersion{
@Override
public void play(String filename) {
vf.decode("Linux",filename);
}
}
//Unix播放器类:扩充抽象类
class UnixVersion extends OperationSystemVersion{
@Override
public void play(String filename) {
vf.decode("Unix",filename);
}
}
客户端测试:
public class Client {
public static void main(String[] args) {
VideoFile file = new RMVBFile();
OperationSystemVersion version = new WindowsVersion();
version.setVideoFile(file);
version.play("《想见你想见你想见你》");
}
}
运行结果:
格式为RMVB的视频文件《想见你想见你想见你》在Windows平台中解码播放
在客户端代码中只需要修改具体视频格式文件类(如RMVBFile)和具体播放器类(如WindowsVersion),即可在不同的操作系统中播放不同格式的文件,可将具体类类名存储在配置文件中,从而实现在不修改源代码的基础上更换具体类,满足开闭原则的要求。
参考文献
【1】桥接模式(Bridge模式)详解
【2】设计模式实训教程(第2版) 刘伟 编著 清华大学出版社