定义:将抽象部分与它的实现部分分离,使它们可以独立的变化。
类型:对象结构型模式
类图:
桥接模式的结构
示例
abstract class IPlugin { public abstract void loadPlugin(); public abstract void unloadPlugin(); public void start() { // add operation } public void stop() { // add operation } } class WindowsPlugin extends IPlugin { @Override public void loadPlugin() { } @Override public void unloadPlugin() { } } class WinPluginVer1 extends WindowsPlugin { @Override public void start() { loadPlugin(); super.start(); } @Override public void stop() { unloadPlugin(); super.stop(); } } class WinPluginVer2 extends WindowsPlugin { @Override public void start() { loadPlugin(); super.start(); } @Override public void stop() { unloadPlugin(); super.stop(); } }
Bridge模式实现代码
//抽象类接口 --> 插件 abstract class IPlugin{ protected IPluginPlatform platform; public void setPlatform(IPluginPlatform platform) { this.platform = platform; } public abstract void start(); public abstract void stop(); } //不同 版本号 实现 class PluginVersionA extends IPlugin{ @Override public void start() { platform.loadPlugin(); } @Override public void stop() { platform.unloadPlugin(); } } class PluginVersionB extends IPlugin{ @Override public void start() { platform.loadPlugin(); } @Override public void stop() { platform.unloadPlugin(); } } //抽象类接口 --> 平台 abstract class IPluginPlatform{ public abstract void loadPlugin(); public abstract void unloadPlugin(); } //Windows平台实现 class WindowsPlugin extends IPluginPlatform{ @Override public void loadPlugin() { System.out.println("WindowsPlugin loading ..."); } @Override public void unloadPlugin() { System.out.println("WindowsPlugin unLoading ..."); } } class LinuxPlugin extends IPluginPlatform{ @Override public void loadPlugin() { System.out.println("LinuxPlugin loading ..."); } @Override public void unloadPlugin() { System.out.println("LinuxPlugin unLoading ..."); } } //客户端调用 public class BridgeClient { /** * @param args */ public static void main(String[] args) { IPlugin plugin = new PluginVersionA(); IPluginPlatform platform = new WindowsPlugin(); plugin.setPlatform(platform); plugin.start(); plugin.stop(); } }
桥接模式的优点
将Abstraction和Implementor分离有助于降低对实现部分编译时刻的依赖性,当改变一个实现类时,并不需要重新编译Abstraction类和它的客户程序。为了保证一个类库的不同版本之间的二进制兼容性,一定要有这个性质。
另外接口与实现分离有助于分层,从而产生更好的结构化系统,系统的高层部分仅需知道Abstraction和Implementor即可。