友情支持

如果您觉得这个笔记对您有所帮助,看在D瓜哥码这么多字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜

支付宝

微信

有些打赏的朋友希望可以加个好友,欢迎关注D 瓜哥的微信公众号,这样就可以通过公众号的回复直接给我发信息。

wx jikerizhi

公众号的微信号是: jikerizhi因为众所周知的原因,有时图片加载不出来。 如果图片加载不出来可以直接通过搜索微信号来查找我的公众号。

7. 桥接模式

7.1. 定义

根据 GoF 的著名著作 《设计模式》,桥接模式的定义如下:

桥接模式(Bridge)

将抽象部分与它的实现部分分离,使它们都可以独立地变化。

— Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides
《设计模式》

7.2. 类图

Diagram

什么叫抽象与它的实现分离,这并不是说,让抽象类与其派生类分离,因为这没有任何意义。实现指的是抽象类和它的派生类用来实现自己的对象[DPE]。

桥接模式的核心意图就是把这些实现独立出来,让它们各自地变化。这就使得每种实现的变化不会影响其他实现,从而达到应对变化的目的。

Implementor类

ConcreteImplementorA和ConcreteImplementorB等派生类

Abstraction类

RefinedAbstraction类

桥接模式所说的‘将抽象部分与它的实现部分分离’,还是不好理解,我的理解就是实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让它们独立变化,减少它们之间的耦合。

在发现我们需要多角度去分类实现对象,而只用继承会造成大量的类增加,不能满足开放-封闭原则时,就应该要考虑用桥接模式了。

只要真正深入地理解了设计原则,很多设计模式其实就是原则的应用而已,或许在不知不觉中就在使用设计模式了。

代码 51. bridge/Abstraction.java 类
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
package com.diguage.didp.bridge;

/**
 * Abstraction 类
 *
 * @author D瓜哥, https://www.diguage.com/
 * @since 2017-05-19 17:53:33
 */
public abstract class Abstraction {
  protected Implementor implementor;

  public void setImplementor(Implementor implementor) {
    this.implementor = implementor;
  }

  public void operation() {
    implementor.operationImpl();
  }
}
代码 52. bridge/ConcreteImplementorA.java 类
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
package com.diguage.didp.bridge;

/**
 * ConcreteImplementorA 类
 *
 * @author D瓜哥, https://www.diguage.com/
 * @since 2017-05-19 17:53:33
 */
public class ConcreteImplementorA extends Implementor {
  @Override
  public void operationImpl() {
    System.out.println("具体实现A的方法执行!");
  }
}
代码 53. bridge/ConcreteImplementorB.java 类
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
package com.diguage.didp.bridge;

/**
 * ConcreteImplementorB 类
 *
 * @author D瓜哥, https://www.diguage.com/
 * @since 2017-05-19 17:53:33
 */
public class ConcreteImplementorB extends Implementor {
  @Override
  public void operationImpl() {
    System.out.println("具体实现B的方法执行!");
  }
}
代码 54. bridge/Implementor.java 类
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
package com.diguage.didp.bridge;

/**
 * Implementor 类
 *
 * @author D瓜哥, https://www.diguage.com/
 * @since 2017-05-19 17:53:33
 */
public abstract class Implementor {
  public abstract void operationImpl();
}
代码 55. bridge/RefinedAbstraction.java 类
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
package com.diguage.didp.bridge;

/**
 * RefinedAbstraction 类
 *
 * @author D瓜哥, https://www.diguage.com/
 * @since 2017-05-19 17:53:33
 */
public class RefinedAbstraction extends Abstraction {
  @Override
  public void operation() {
    implementor.operationImpl();
  }
}
代码 56. bridge/Client.java 类
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
package com.diguage.didp.bridge;

/**
 * @author D瓜哥, https://www.diguage.com/
 * @since 2017-05-26
 */
public class Client {
  public static void main(String[] args) {
    Abstraction abstraction = new RefinedAbstraction();
    abstraction.setImplementor(new ConcreteImplementorA());
    abstraction.operation();


    abstraction.setImplementor(new ConcreteImplementorB());
    abstraction.operation();
  }
}

7.3. 常见示例

  1. JDBC

  2. AWT