概念
将抽象与实现分离,使它们可以独立变化。使用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度
结构
抽象实现化角色
一个抽象类或接口
具体实现化角色
实现了抽象实现化角色的方法
抽象化角色
一个抽象类,包含了一个对实现化角色的引用
扩展抽象化角色
实现了抽象化角色的方法,通过组合关系调用实现化角色中业务方法
示例
目标:有两种维度的东西,一种为视频文件,有MP4、AVI类型;一种为手机,有安卓、苹果类型。现在需要使用手机的方法播放视频文件
抽象实现化角色
package 设计模式.结构型模式.桥接模式;
/**
* 堆代码 duidaima.com
* 视频:抽象实现化角色
*/
public interface Video {
/**
* 读取文件
*/
void readFile(String fileName);
}
具体实现化对象一
package 设计模式.结构型模式.桥接模式;
/**
* MP4:具体实现化角色
*/
public class Mp4 implements Video {
/**
* 读取文件
*/
@Override
public void readFile(String fileName) {
System.out.println("MP4视频:" + fileName);
}
}
具体实现化对象二
package 设计模式.结构型模式.桥接模式;
/**
* AVI:具体实现化角色
*/
public class Avi implements Video {
/**
* 读取文件
*/
@Override
public void readFile(String fileName) {
System.out.println("AVI视频:" + fileName);
}
}
抽象化角色
package 设计模式.结构型模式.桥接模式;
/**
* 手机:抽象化角色
*/
public abstract class Phone {
/** 具体实现化角色 */
Video video;
/**
* 构造方法
*/
Phone(Video video) {
this.video = video;
}
/**
* 播放视频
*/
abstract void playVideo(String fileName);
}
扩展抽象化角色一
package 设计模式.结构型模式.桥接模式;
/**
* 安卓手机:扩展抽象化角色
*/
public class Android extends Phone {
/**
* 构造方法
*/
Android(Video video) {
super(video);
}
/**
* 播放视频
*/
@Override
void playVideo(String fileName) {
video.readFile(fileName);
}
}
扩展抽象化角色二
package 设计模式.结构型模式.桥接模式;
/**
* 苹果手机:扩展抽象化角色
*/
public class Apple extends Phone {
/**
* 构造方法
*/
Apple(Video video) {
super(video);
}
/**
* 播放视频
*/
@Override
void playVideo(String fileName) {
video.readFile(fileName);
}
}
测试类
package 设计模式.结构型模式.桥接模式;
public class Demo {
public static void main(String[] args) {
// 创建MP4对象:具体实现化对象
Video video = new Mp4();
// 创建安卓手机对象:扩展抽象化角色
Phone phone = new Android(video);
// 播放视频
phone.playVideo("熊出没");
}
}
优缺点
优点
1.提高了系统的可扩展性,在两个变化维度中任意扩展其中一个维度,都不需要修改原有系统
2.实现了细节对客户的透明化
应用场景
1.当一个类存在两个独立变化的维度、且这两个维度都需要进行扩展时,可以使用桥接模式
2.当一个系统不希望使用继承方式或者继承方式会导致类的个数急剧增加时,可以使用桥接模式
3.当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时,需要避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系