桥接模式
桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interfce)模式
特点
优点
• 分离抽象接口及其实现部分。
• 桥接模式有时类似于多继承方案,但是多继承方案违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差,而且多继承结构中类的个数非常庞大,桥接模式是比多继承方案更好的解决方法。
• 桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。
• 实现细节对客户透明,可以对用户隐藏实现细节。
缺点
• 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
• 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。
UML图
例题:
如果需要开发一个跨平台视频播放器,可以在不同操作系统平台(如Windows,Linux,UNIX等)上放各种格式的视频文件,常见的视频格式包括MPEG,RMVB,AVI,WMV等.现使用桥接模式设计该播放器.
设计类图:
例题代码:
public abstract class OperatingSystemVersion {//创建系统平台抽象类
protected VideoFile Vf;
public void setVideoFile(VideoFile Vf){
this.Vf=Vf;
}
public void play(String FileName){};
}
class WindowsVersion extends OperatingSystemVersion{//window继承类
public void play(String FileName){
String osType="windows下播放";
this.Vf.decode(osType,FileName);
}
}
class LinuxVersion extends OperatingSystemVersion{//Linux 继承类
public void play(String FileName){
String osType="linux下播放";
this.Vf.decode(osType,FileName);
}
}
class UnixVersion extends OperatingSystemVersion{//Unix 继承类
public void play(String FileName){
String osType="Unix下播放";
this.Vf.decode(osType,FileName);
}
}
public interface VideoFile {//创建视频格式接口
public void decode(String osType,String FileName);
}
class MPEGFile implements VideoFile{//MPEG格式类实现接口
@Override
public void decode(String osType, String FileName) {
System.out.println(osType+"MPEG格式的"+FileName+".");
}
}
class RMVFile implements VideoFile{//PMV格式类实现接口
@Override
public void decode(String osType, String FileName) {
System.out.println(osType+"RMV格式的"+FileName+".");
}
}
class AVIFile implements VideoFile{//AVI格式类实现接接口
@Override
public void decode(String osType, String FileName) {
System.out.println(osType+"AVI格式的"+FileName+".");
}
}
class WMVFile implements VideoFile{//WMV格式类实现接口
@Override
public void decode(String osType,String FileName){
System.out.println(osType+"WMV格式的"+ FileName+".");
}
}
import java.util.Scanner;
public class Client { //实例演示
public static void main(String[] args) {
String File="西游记";
VideoFile videoFile;
Scanner scanner=new Scanner(System.in);
while(true) {
System.out.println("请选择播放系统 1.Windows 2.Linux 3.Unix 4.退出");
int j = scanner.nextInt();
if(j==1) {
OperatingSystemVersion systemVersion = new WindowsVersion();
while(true){
System.out.println("请选择播放格式 1.MPEG 2.RMV 3.AVI 4.WMV 5.退出");
int i=scanner.nextInt();
if(i==1) {
videoFile = new MPEGFile();
systemVersion.setVideoFile(videoFile);
systemVersion.play(File);
}else if(i==2){
videoFile=new RMVFile();
systemVersion.setVideoFile(videoFile);
systemVersion.play(File);
}else if(i==3){
videoFile=new AVIFile();
systemVersion.setVideoFile(videoFile);
systemVersion.play(File);
}else if(i==4){
videoFile=new WMVFile();
systemVersion.setVideoFile(videoFile);
systemVersion.play(File);
}else{
break;
}
}
}else if(j==2){
OperatingSystemVersion systemVersion = new LinuxVersion();
while (true) {
System.out.println("请选择播放格式 1.MPEG 2.RMV 3.AVI 4.WMV 5.退出");
int i = scanner.nextInt();
if (i == 1) {
videoFile = new MPEGFile();
systemVersion.setVideoFile(videoFile);
systemVersion.play(File);
} else if (i == 2) {
videoFile = new RMVFile();
systemVersion.setVideoFile(videoFile);
systemVersion.play(File);
} else if (i == 3) {
videoFile = new AVIFile();
systemVersion.setVideoFile(videoFile);
systemVersion.play(File);
} else if (i == 4) {
videoFile = new WMVFile();
systemVersion.setVideoFile(videoFile);
systemVersion.play(File);
} else {
break;
}
}
}else if(j==3){
OperatingSystemVersion systemVersion = new UnixVersion();
while(true) {
System.out.println("请选择播放格式 1.MPEG 2.RMV 3.AVI 4.WMV 5.退出");
int i = scanner.nextInt();
if (i == 1) {
videoFile = new MPEGFile();
systemVersion.setVideoFile(videoFile);
systemVersion.play(File);
} else if (i == 2) {
videoFile = new RMVFile();
systemVersion.setVideoFile(videoFile);
systemVersion.play(File);
} else if (i == 3) {
videoFile = new AVIFile();
systemVersion.setVideoFile(videoFile);
systemVersion.play(File);
} else if (i == 4) {
videoFile = new WMVFile();
systemVersion.setVideoFile(videoFile);
systemVersion.play(File);
} else {
break;
}
}
}else{
break;
}
}
}
}
运行结果: