四、桥接模式
1. 定义
:
- 将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实 现这两个可变维度的耦合度。
2. 结构
-
抽象化(Abstraction)角色 :定义抽象类,并包含一个对实现化对象的引用
-
扩展抽象化(Refined Abstraction)角色 :是抽象化角色的子类,实现父类中的业务方法, 并通过组合关系调用实现化角色中的业务方法。
-
实现化(Implementor)角色 :定义实现化角色的接口,供扩展抽象化角色调用。
-
具体实现化(Concrete Implementor)角色 :给出实现化角色接口的具体实现
3. 案例
不同操作系统播放不同格式文件
- UML
![image-20210522211942014](https://gitee.com/jerrygrj/img/raw/master/img/image-20210522211942014.png)
4. 代码
- MusicFile
//音乐文件(实现化角色)public interface MusicFile { void format(String fileName);}
- Mp3
//Mp3文件(具体的实现化角色)public class Mp3 implements MusicFile{ @Override public void format(String fileName) { System.out.println(fileName+".mp3"); }}
- Wma
//Wma文件(具体的实现化角色)public class Wma implements MusicFile{ @Override public void format(String fileName) { System.out.println(fileName + ".wma"); }}
- PhoneSystem
//抽象的手机操作系统类(抽象化角色)public abstract class PhoneSystem { protected MusicFile musicFile; public PhoneSystem(MusicFile musicFile) { this.musicFile = musicFile; } public abstract void play(String fileName);}
- Android
//Android操作系统(扩展抽象化角色)public class Android extends PhoneSystem{ public Android(MusicFile musicFile) { super(musicFile); } @Override public void play(String fileName) { musicFile.format(fileName); }}
- Ios
//Ios操作系统(扩展抽象化角色)
public class Ios extends PhoneSystem{
public Ios(MusicFile musicFile) {
super(musicFile);
}
@Override
public void play(String fileName) {
musicFile.format(fileName);
}
}
- 测试类
public class Client {
public static void main(String[] args) {
MusicFile rmvb = new Wma();
PhoneSystem ps = new Ios(rmvb);
ps.play("Tom&Jerry");
ps = new Android(new Mp3());
ps.play("Tom&Jerry");
}
}
//运行结果
//Tom&Jerry.rmvb
//Tom&Jerry.mp4
5. 好处
- 提高系统可扩充性,若添加一个文件类型,定义一个类实现接口即可
- 实现细节对客户透明
6. 使用场景
- 一个类存在两个独立变化的维度,且两维度都需要进行扩展