- 桥接模式
桥接模式也称为桥梁模式、接口模式或者柄体(Handle and Body)模式,是将抽象部分与他的具体实现部分分离,使它们都可以独立地变化,通过组合的方式建立两个类之间的联系,而不是继承。
桥接(Bridge)模式包含以下主要角色:
- 抽象化(Abstraction)角色 :定义抽象类,并包含一个对实现化对象的引用。
- 扩展抽象化(Refined Abstraction)角色 :是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
- 实现化(Implementor)角色 :定义实现化角色的接口,供扩展抽象化角色调用。
- 具体实现化(Concrete Implementor)角色 :给出实现化角色接口的具体实现。
1.1 代码实现
下面以一个多系统多视频格式文件播放为例子:
// 视频接口
public interface Video {
void decode(String fileName);
}
// MP4格式类
public class Mp4 implements Video{
@Override
public void decode(String fileName) {
System.out.println("MP4视频文件:"+ fileName);
}
}
// RMVB格式类
public class Rmvb implements Video{
@Override
public void decode(String fileName) {
System.out.println("rmvb文件:" + fileName);
}
}
// 操作系统抽象类
@AllArgsConstructor
public abstract class OperatingSystem {
Video video;
public abstract void play(String fileName);
}
// iOS系统
public class Ios extends OperatingSystem {
public Ios(Video video){
super(video);
}
@Override
public void play(String fileName) {
video.decode(fileName);
}
}
// windows系统
public class Windows extends OperatingSystem {
public Windows(Video video){
super(video);
}
@Override
public void play(String fileName) {
video.decode(fileName);
}
}
可以通过类图看到,视频类和操作系统类之间通过OperatingSystem类桥接关联起来。
1.2 总结
适用场景:
- 在抽象和具体实现之间需要增加更多的灵活性的场景。
- 一个类存在两个(或多个)独立变化的维度,而这两个(或多个)维度都需要独立进行扩展。
- 不希望使用继承,或因为多层继承导致系统类的个数剧增。
优点:
- 分离抽象部分及其具体实现部分。
- 提高了系统的扩展性。
- 符合开闭原型。
- 符合合成复用原则。
缺点:
- 增加了系统的理解与设计难度。
- 需要正确地识别系统中两个独立变化的维度。