Java 设计模式之桥接模式
一、定义
将抽象和实现分离,使他们可以独立变化,他是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
主要角色:
抽象化:定义抽象类,并包含一个对实现化对象的引用。
扩展抽象化:是抽象化角色的子类,实现父类的业务方法,并通过组合关系调用实现化角色中的业务方法。
实现化:定义实现化角色的接口,供扩展抽象化角色调用。
具体实现化:给出实现化角色接口的具体实现。
二、代码实现
举例:比如当前要开发一款跨平台播放器,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类来实现实现化角色即可。符合开闭原则。