概述 桥接模式适合于存在两个维度变化的情形。这种情况下一个维度的变化往往会引起另一个维度的变化。这样扩展起来变得十分困难。桥接模式的主要思路就是将两个维度的变化独立开来,不会产生相互影响。 抽象部分的接口一般维护一个现实部分的对象引用,抽象对象里面的方法,需要调用实现部分的对象来完成。这个对象中的方法通常都是和具体的业务相关的方法。
扩展抽象方法通常在这些对象中定义和业务相关的方法,这些方法会使用抽象部分接口中的方法。也可能需要调用实现部分对象来完成。
实现部分的接口,提供基本操作,抽象部分定义的一般都是基于这些基本操作的业务方法。 实现部分的接口一般有如下几种实现方式:
由客户端负责创建,并在创建抽象部分接口的时候作为参数设置到抽象部分的对象中去。
可以在抽象部分对象构建的时候,由抽象部分的对象自己来创建对应的现实部分的对象。
可以使用抽象工厂或者简单工厂来选择并创建具体的实现部分。
可以在抽象部分选择并创建一个默认的实现部分,子类可以根据具体的需要改变这个实现。
何时使用桥接模式: 不希望抽象和实现部分采用固定的绑定关系的时候,可以采用桥接模式把抽象和实现部分分开,然后在程序运行期间动态得设置抽象部分需要用到的具体实现,还可以动态地切换具体的实现。 如果希望实现部分的修改不会对客户端产生影响,可以采用桥接模式,由于客户是面向抽象的接口在运行,实现部分的修改可以独立于抽象部分,而不会对客户端产生影响。
public interface Implementor { public void someOperator () ; }
public class ConcreImplementor1 implements Implementor { public void someOperator() { System.out .println("This is someOperator from ConcreImplementor1" ); } }
public class ConcreImplementor2 implements Implementor { public void someOperator() { System.out .println("This is someOperator from ConcreImplementor2" ); } }
public abstract class AbstractPart { private Implementor mImplementor = null ; public AbstractPart (Implementor imp ) { this .mImplementor = imp; } public void otherOperator () { this .mImplementor.someOperator(); } }
public class RedefineAbstract extends AbstractPart { public RedefineAbstract (Implementor imp) { super (imp); } public void othersOperator() { System .out.println("Add some pre Operation" ); super .otherOperator(); } }
public class Client { public static void main(String [] args) { Implementor imp1 = new ConcreImplementor1 (); RedefineAbstract abstract1 = new RedefineAbstract (imp1); abstract1.othersOperator(); Implementor imp2 = new ConcreImplementor2 (); RedefineAbstract abstract2 = new RedefineAbstract (imp2); abstract2.othersOperator(); } }