设计模式之桥接模式笔记
- 说明
- Bridge(桥接)
- 目录
- 桥接模式示例类图
- 视频文件接口
- avi视频文件类
- rmvb视频文件类
- 抽象的操作系统类
- windows类
- mac类
- 测试类
说明
记录下学习设计模式-桥接模式的写法。JDK使用版本为1.8版本。
Bridge(桥接)
意图:将抽象部分与其实现部分分离,使它们都可以独立地变化。
结构:
其中:
- Abstraction定义抽象类的接口,维护一个指向Implementor类型对象的指针。
- RefinedAbstraction扩充由Abstraction定义的接口。
- Implementor定义实现类的接口,该接口不一定要与Abstraction的接口完全一致;事实上这两个接口可以完全不同。一般来说,Implementor接口仅提供基本操作,而Abstraction定义了基于这些基本操作的较高层次的操作。
- ConcreteImplementor实现Implementor接口并定义它的具体实现。
适用性:
- 当一个类存在两个独立变化的维度,且这两个都需要进行扩展时。
- 当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。
- 当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
目录
桥接模式示例类图
以该UML类图实现桥接模式示例。
视频文件接口
package com.example.deesign_patterns.bridge;
//视频文件
public interface VideoFile {
//解码功能
void decode(String fileName);
}
avi视频文件类
package com.example.deesign_patterns.bridge;
//avi视频文件类
public class AviFile implements VideoFile{
@Override
public void decode(String fileName) {
System.out.println("avi视频文件:"+fileName);
}
}
rmvb视频文件类
package com.example.deesign_patterns.bridge;
//rmvb视频文件类
public class RmvbFile implements VideoFile{
@Override
public void decode(String fileName) {
System.out.println("rmvb视频文件:"+fileName);
}
}
抽象的操作系统类
package com.example.deesign_patterns.bridge;
//抽象的操作系统类
public abstract class OperatingSystem {
//声明VideoFile变量
protected VideoFile videoFile;
public OperatingSystem(VideoFile videoFile) {
this.videoFile = videoFile;
}
//播放视频方法
public abstract void play(String fileName);
}
windows类
package com.example.deesign_patterns.bridge;
//windows类
public class Windows extends OperatingSystem{
public Windows(VideoFile videoFile) {
super(videoFile);
}
@Override
public void play(String fileName) {
videoFile.decode(fileName);
}
}
mac类
package com.example.deesign_patterns.bridge;
//mac类
public class Mac extends OperatingSystem{
public Mac(VideoFile videoFile) {
super(videoFile);
}
@Override
public void play(String fileName) {
videoFile.decode(fileName);
}
}
测试类
package com.example.deesign_patterns.bridge;
//测试类
public class Client {
public static void main(String[] args) {
//创建mac系统对象
OperatingSystem system=new Mac(new AviFile());
//使用操作系统播放视频文件
system.play("战狼3");
}
}
好处:
- 桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。如:如果现在还有一种视频文件类型wmv,我们只需要再定义一个类实现VideoFile接口即可,其他类不需要发生变化。
- 实现细节对客户透明。