1,定义
桥接模式(Bridge Pattern),也称为桥梁模式,其用意是将抽象化与实现化脱耦,使得两者可以独立的变化,它可以使软件系统沿着多个方向进行变化,而又不引入额外的复杂度,
桥接模式是连接功能与实现部分的设计模式,其用意在于使功能与实现分离,从而支持多维度的变化。
现实抽象理解:
开关与电灯,开关通过电线连接电灯,进而控制电灯,在这里,电灯可以认为是实现部分,而开关代表功能部分,我们可以独立的更换开关或电灯两者之一,而对另一方没有任何影响, 也就是说每个部分的变化(更换)对另一部分不会造成影响。
2,模式分析
- 将抽象与实现解耦,从而使两者可以相对独立的变化而互不影响;
- 使用聚合关联,不使用继承关联;
- 应对多维度的变化需求;
- 在两种层次间扮演彼此沟通的桥梁,把不同层次区分开来,使两个层次在分别在各之的方向扩展。
3, 使用场合
- 不希望在抽象类和它的实现部分之间有一个固定的绑定关系;
- 类的抽象及实现都应该可以通过生成子类的方法加以扩充;
- 对一个抽象的部分的更改应该对客户端没有任何影响,即客户的代码不必重新编译。
以电灯及开关为例,开关可控制不同的电灯
从上面静态类国可以看出,由实现部分,功能部分及桥梁共同实现桥接模式
实现部分与功能部分可以各自在自己的类层次上扩展,而对其它部分没有任何影响,我们可以通过实现ILight接品添加新的电灯,同样可以通过继承BaseSwitch实现新的开关,所以,实现部分与功能部分可以实现各自的扩展,模式支持多维度的变化
把电灯实例注入开关中,实现功能与实现部分的桥梁作用。
电灯接口:
package com.demo.bridge.lights; /** * 电灯接口 * * @author * */ public interface ILight { // 接通电流 public void electricConnected(); // 照明 public void light(); // 电流关闭 public void electricClosed(); }
一般开关:
通过此处把电灯实例注入进来,充当功能部分与实现部分的沟通桥梁的作用,调用实现部分实现真正的开灯动作
package com.demo.bridge.switchs; import com.demo.bridge.lights.ILight; /** * 开关顶层类 * * @author * */ public class BaseSwitch { // 使用组合 设置ILight为内部私有属性 此为桥梁 protected ILight light; // 构造方法将 外部的light类型注入进来 public BaseSwitch(ILight light) { this.light = light; } /** * 开灯方法 */ public final void makeLight() { // 打开开关 接通电流 this.light.electricConnected(); // 照明 this.light.light(); // 关闭开关 关闭电流 this.light.electricClosed(); } }
摇控开关:
调用实现部分实现真正的开灯动作,只是在功能上添加颜色,由此可见,我们可以通过添加新的功能类实现新的功能,而对实现部分没有任何影响。
package com.demo.bridge.switchs.sub; import com.demo.bridge.lights.ILight; import com.demo.bridge.switchs.BaseSwitch; /** * 遥控开关 继承BaseSwitch 扩展功能 * * @author * */ public class RemoteControlSwitch extends BaseSwitch { // 构造方法 public RemoteControlSwitch(ILight light) { super(light); } /** * 使用遥控开关控制开灯 * * @param operColor * 灯颜色 */ public final void makeRemoteLight(int operColor) { // 打开开关 接通电流 this.light.electricConnected(); // 照明 this.light.light(); String color = ""; switch (operColor) { case 1: color = "暖色"; break; case 2: color = "蓝色"; break; case 3: color = "红色"; break; default: color = "白色"; break; } System.out.println(" ...现在是" + color + "!"); // 关闭开关 关闭电流 this.light.electricClosed(); } }
白炽灯实现:
package com.demo.bridge.lights.impl; import com.demo.bridge.lights.ILight; /** * 白炽灯 实现 * * @author * */ public class IncandescentLight implements ILight { // 电流关闭 public void electricClosed() { System.out.println("白炽灯被关闭了..."); } // 接通电流 public void electricConnected() { System.out.println("白炽灯被打开了..."); } // 照明 public void light() { System.out.println("白炽灯照明!"); } }
水晶灯实现:
package com.demo.bridge.lights.impl; import com.demo.bridge.lights.ILight; /** * 水晶灯 实现 * * @author * */ public class CrystalLight implements ILight { // 电流关闭 public void electricClosed() { System.out.println("水晶灯被关闭了..."); } // 接通电流 public void electricConnected() { System.out.println("水晶灯被打开了..."); } // 照明 public void light() { System.out.println("水晶灯照明!"); } }
客户程序:
我们也可以让一般开发控制水晶灯,只需把水晶灯实例注入到一般开关中
package com.demo; import com.demo.bridge.lights.ILight; import com.demo.bridge.lights.impl.CrystalLight; import com.demo.bridge.lights.impl.IncandescentLight; import com.demo.bridge.switchs.BaseSwitch; import com.demo.bridge.switchs.sub.RemoteControlSwitch; /** * 客户端应用程序 * * @author * */ public class ClientForBridge { /** * @param args */ public static void main(String[] args) { // 白炽灯 实例 ILight incandescentLight = new IncandescentLight(); // 水晶灯 实例 ILight crystalLight = new CrystalLight(); // 一般开关 System.out.println("-- 一般开关 -- "); BaseSwitch switch1 = new BaseSwitch(incandescentLight); switch1.makeLight(); System.out.println(" -- 遥控开关 -- "); // 遥控开关 RemoteControlSwitch remoteControlSwitch = new RemoteControlSwitch( crystalLight); remoteControlSwitch.makeRemoteLight(1); } }
运行结果: