(1)概述
将抽象与实现分离,使它们可以独立变化,用组合关系代替继承关系来实现,从而降低抽象和实现这两个可变维度的耦合度
(2)结构
- 抽象化角色:定义抽象类,并包含一个对实现化角色的引用
- 扩展抽象化角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法
- 实现化角色:定义实现化角色的接口(也可以是抽象类),供扩展抽象化角色调用
- 具体实现化角色:给出实现化角色接口的具体实现
(3)案例
以视频播放器为例(可以在不同操作系统上播放多种格式的视频文件)
实现化角色
public interface VideoFile {
/**
* 视频解码
*
* @param fileName
*/
void decode(String fileName);
}
具体实现化角色
public class MkvFile implements VideoFile {
@Override
public void decode(String fileName) {
System.out.println("播放mkv视频文件:" + fileName);
}
}
public class Mp4File implements VideoFile {
@Override
public void decode(String fileName) {
System.out.println("播放mp4视频文件:" + fileName);
}
}
抽象化角色
public abstract class OperationSystem {
//声明VideoFile变量
protected VideoFile videoFile;
public OperationSystem(VideoFile videoFile) {
this.videoFile = videoFile;
}
/**
* 播放视频
*
* @param fileName
*/
public abstract void play(String fileName);
}
扩展抽象化角色
public class Windows extends OperationSystem {
public Windows(VideoFile videoFile) {
super(videoFile);
}
@Override
public void play(String fileName) {
videoFile.decode(fileName);
}
}
public class Mac extends OperationSystem {
public Mac(VideoFile videoFile) {
super(videoFile);
}
@Override
public void play(String fileName) {
videoFile.decode(fileName);
}
}
(4)优缺点
- 提高了系统的可扩展性,在两个变化的维度中任意扩展一个维度,都不需要修改原有系统
- 实现细节对客户透明
(5)使用场景
- 当一个类存在两个独立变化的维度,且这两个维度都需要扩展时
- 当一个系统不希望使用继承或因多层次继承导致类爆炸时
- 当一个系统需要在构建的抽象化角色和具体化角色之间增加更多的灵活性时(避免在两个层次之间建立静态的继承联系,可通过桥接模式(聚合引用方式)使它们在抽象层建立一个关联关系)
评论 (0)