一、定义
将抽象和实现分离,使他们可以独立变化,他是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
主要角色:
抽象化:定义抽象类,并包含一个对实现化对象的引用。
扩展抽象化:是抽象化角色的子类,实现父类的业务方法,并通过组合关系调用实现化角色中的业务方法。
实现化:定义实现化角色的接口,供扩展抽象化角色调用。
具体实现化:给出实现化角色接口的具体实现。
二、代码实现
举例:比如当前要开发一款跨平台播放器,Windows,Linux,要求可以播放Mp4和Avi格式的视频,其中操作系统和视频格式就是上面所说的两个可变维度,一个是操作系统,一个是视频格式,他是两个不同的维度。接下来看代码实现。
实现化角色(播放器)
public interface VideoPlayer {
void playVideo(String name);
}
具体实现化角色(Mp4播放器)
public class Mp4Player implements VideoPlayer {
@Override
public void playVideo(String name) {
System.out.println(name+"播放Mp4");
}
}
具体实现化角色(Avi播放器)
public class AviPlayer implements VideoPlayer{
@Override
public void playVideo(String name) {
System.out.println(name+"播放Avi");
}
}
抽象化角色(操作系统)
public abstract class MySystem {
protected VideoPlayer player;//持有实现化对象
public MySystem(VideoPlayer player) {
this.player = player;
}
public abstract void play();
}
扩展抽象化角色(Windows系统)
public class Windows extends MySystem {
public Windows(VideoPlayer player) {
super(player);
}
@Override
public void play() {
player.playVideo("Windows");
}
}
扩展抽象化角色(Linux系统)
public class Linux extends MySystem {
public Linux(VideoPlayer player) {
super(player);
}
@Override
public void play() {
player.playVideo("Linux");
}
}
使用:
public static void main(String[] args) {
//创建Windows系统
MySystem windows = new Windows(new Mp4Player());
windows.play();
MySystem windows1 = new Windows(new AviPlayer());
windows1.play();
//创建Linux系统
MySystem linux = new Linux(new Mp4Player());
linux.play();
MySystem linux1 = new Linux(new AviPlayer());
linux1.play();
}
输出:
Windows播放Mp4
Windows播放Avi
Linux播放Mp4
Linux播放Avi
桥接模式提高了系统的扩展性,可以在两个维度中任意扩展,不需要修改原有系统,拿上面的例子来说 如果要播放Wmv格式的视频,那么只需要定义一个Wmv类来实现实现化角色即可。符合开闭原则。
网友评论