概述

桥接模式适合于存在两个维度变化的情形。这种情况下一个维度的变化往往会引起另一个维度的变化。这样扩展起来变得十分困难。桥接模式的主要思路就是将两个维度的变化独立开来,不会产生相互影响。
抽象部分的接口一般维护一个现实部分的对象引用,抽象对象里面的方法,需要调用实现部分的对象来完成。这个对象中的方法通常都是和具体的业务相关的方法。

扩展抽象方法通常在这些对象中定义和业务相关的方法,这些方法会使用抽象部分接口中的方法。也可能需要调用实现部分对象来完成。

实现部分的接口,提供基本操作,抽象部分定义的一般都是基于这些基本操作的业务方法。
实现部分的接口一般有如下几种实现方式:

  1. 由客户端负责创建,并在创建抽象部分接口的时候作为参数设置到抽象部分的对象中去。
  2. 可以在抽象部分对象构建的时候,由抽象部分的对象自己来创建对应的现实部分的对象。
  3. 可以使用抽象工厂或者简单工厂来选择并创建具体的实现部分。
  4. 可以在抽象部分选择并创建一个默认的实现部分,子类可以根据具体的需要改变这个实现。

何时使用桥接模式:

不希望抽象和实现部分采用固定的绑定关系的时候,可以采用桥接模式把抽象和实现部分分开,然后在程序运行期间动态得设置抽象部分需要用到的具体实现,还可以动态地切换具体的实现。
如果希望实现部分的修改不会对客户端产生影响,可以采用桥接模式,由于客户是面向抽象的接口在运行,实现部分的修改可以独立于抽象部分,而不会对客户端产生影响。

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();
}
}
Contents
  1. 1. 概述
  2. 2. 何时使用桥接模式: