桥接模式 :
桥接模式类型 : 结构型 ;
桥接模式 相当于 使用桥梁 将两侧连接起来 , 这里指的是 使用桥梁 连接两个类 , 在两个类之间建立某种联系 , 可以通过继承 , 也可以通过组合 , 桥接模式 是采用 组合的方式 , 建立两个类之间的关系 ; 合成复用原则 , 推荐优先使用组合 , 不是继承 ; 桥接模式 可以防止子类过多 , 造成系统复杂的情况 ;
桥接模式的重点 是 理解 类的 抽象部分 和 具体的实现部分 ;
如 : 开发跨平台的视频播放器 , 平台有 Android , iOS , Windows , Linux , Mac , 播放器支持的格式有 MP4 , AVI , RMVB , FLV 格式 ; 这种情况下 , 适合使用桥接模式 ;
桥接模式适用场景 :
个或更多的 独立变化维度 , 并且这些维度都需要 独立扩展 ; 抽象部分可以 独立扩展 , 具体实现的部分 , 也可以独立扩展 ;
桥接模式优点 :
桥接模式缺点 :
桥接模式的使用范围 , 有一定的局限性 ;
桥接模式与组合模式 :
桥接模式与适配器模式 :
业务逻辑场景 : 开发跨平台的视频播放器 , 平台有 Android , iOS , Windows , Linux , Mac , 播放器支持的格式有 MP4 , AVI , RMVB , FLV 格式 ; 这种情况下 , 适合使用桥接模式 ;
平台 : 播放器支持 Linux , Android 平台 ; 视频格式 : 播放器支持 MP4 , FLV 视频格式 ;
这里分为两块 , 一块是平台 , 一块是视频格式 ; 平台可以不断的扩展 , 如 : Windows , iOS , MAC , 嵌入式平台 ; 视频类型也可以不断的扩展 , 如 : H264 , H265 , MPEG 等 ; 二者可以随着自己的层级进行扩展 ;
桥接模式 最重要的是 将 抽象 与 实现 解耦 , 通过组合 在 抽象 与 实现 之间搭建桥梁 ;
package bridge;
public interface Vedio {
/**
* 打开视频
* 可以打开 MP4 / FLV 格式视频
* 视频 ( 格式 ) 是个 抽象
* @return
*/
Vedio openVedio();
/**
* 查看视频信息
*/
void showVedio();
}
package bridge;
/**
* FLV 视频格式
*/
public class FlvVedio implements Vedio {
@Override
public Vedio openVedio() {
System.out.println("打开 FLV 格式视频");
return new FlvVedio();
}
@Override
public void showVedio() {
System.out.println("当前视频格式是 FLV");
}
}
package bridge;
/**
* MP4 格式
*/
public class MP4Vedio implements Vedio {
@Override
public Vedio openVedio() {
System.out.println("打开 MP4 格式视频");
return new MP4Vedio();
}
@Override
public void showVedio() {
System.out.println("当前视频格式是 MP4");
}
}
package bridge;
/**
* 平台操作系统 抽象类
*/
public abstract class Platform {
/**
* 这是桥接模式最核心的代码
* 在 Platform 中通过组合方式关联 Vedio
* Platform 的子类也可以关联 Vedio 子类
*/
protected Vedio account;
public Platform(Vedio account) {
this.account = account;
}
/**
* 该方法与 Vedio 中的方法名相同
* 方法名相同不是强制的
* @return
*/
abstract Vedio openVedio();
}
package bridge;
public class LinuxPlatform extends Platform {
public LinuxPlatform(Vedio account) {
super(account);
}
@Override
Vedio openVedio() {
System.out.println("在 Linux 平台播放视频");
return account;
}
}
package bridge;
public class AndroidPlatform extends Platform {
public AndroidPlatform(Vedio account) {
super(account);
}
@Override
Vedio openVedio() {
System.out.println("在 Android 平台打开视频");
return account;
}
}
package bridge;
public class Main {
public static void main(String[] args) {
// 在 Linux 平台打开 FLV 视频
Platform linuxPlatform = new LinuxPlatform(new FlvVedio());
Vedio linuxFlv = linuxPlatform.openVedio();
linuxFlv.showVedio();
System.out.println();
// 在 Android 平台打开 MP4 视频
Platform androidPlatform = new AndroidPlatform(new MP4Vedio());
Vedio androidMp4 = androidPlatform.openVedio();
androidMp4.showVedio();
}
}
执行结果 :
在 Linux 平台播放视频
当前视频格式是 FLV
在 Android 平台打开视频
当前视频格式是 MP4