第七篇 调整类间关系 第十九章 - 桥接模式

  接下来的几个章节,我们一起讨论类(class)之间的关系。
  类是对象的描述,也是面向对象软件的基本单元,它们之间总是存在着或近或远的关系。从结构上来看,若干类有机结合,才构成了完整的软件;从系统建模的角度来看,某个类可能代表了系统中的某个概念,而使不同概念产生联系,正是系统的魅力所在。
  类之间的关系如此普遍和重要,它们又是如何建立的呢?
  假设有两个相对独立的类:“油菜花”类和“蝴蝶”类。

// 油菜花
public class ColeFlower {}

// 蝴蝶
public class Butterfly {}

  现在为它们建立联系:油菜花吸引蝴蝶为其传粉;作为回报,蝴蝶可以享用油菜花的蜜汁。
  我们可以直接将这两个类关联起来,像下面这样。

// 油菜花
public class ColeFlower {

  // 传粉
  public void pollinate(Butterfly obj) {
    // 蝴蝶享用蜜汁
  }

}

  这是一种比较紧密的耦合关系,其缺点在于可扩展性不足。如果将“蝴蝶”换作“蜜蜂”,亦或将“蝴蝶”协助传粉的方法从“享用蜜汁”改成“追逐花香”,“油菜花”都要被动修改以适应这些变化。
  再看看桥接模式提供的设计思路。

// 传粉媒介
public interface Pollinatable {

  public void pollinate();

}

// 蝴蝶
public class Butterfly implements Pollinatable {

  // 传粉
  @Override
  public void pollinate() {
    this.takeNectar();
  }

  // 享用蜜汁
  public void takeNectar() {}

}

// 花
public abstract class Flower {

  // 传粉媒介
  protected Pollinatable obj;

  // 花与传粉媒介之间的“桥梁”
  public Flower(Pollinatable obj) {
    this.obj = obj;
  }

  // 传粉
  public abstract void pollinate();

}

// 油菜花
public class ColeFlower extends Flower {

  public ColeFlower(Pollinatable obj) {
    super(obj);
  }

  // 传粉
  @Override
  public void pollinate() {
    super.obj.pollinate();
  }

}

// 测试类
public class Test {

  public void test() {
    Pollinatable p = new Butterfly();
    Flower f = new ColeFlower(p);
    f.pollinate();
  }

}

  这里将“油菜花”类和“蝴蝶”类的关联关系建立在了它们的抽象层面——抽象“花”类和“传粉媒介”接口之间。这是一种更加松散的耦合关系,可扩展性明显增强。
  将“蝴蝶”换作“蜜蜂”时,“油菜花”无需修改。

// 蜜蜂
public class Bee implements Pollinatable {

  // 传粉
  @Override
  public void pollinate() {
    this.takeNectar();
  }

  // 享用蜜汁
  public void takeNectar() {}

}

// 测试类
public class Test {

  public void test() {
    // Pollinatable p = new Butterfly();
    Pollinatable p = new Bee();
    Flower f = new ColeFlower(p);
    f.pollinate();
  }

}

  改变“蝴蝶”协助传粉的方法时,“蝴蝶”对“油菜花”的约定(接口方法是一种约定)——pollinate()方法——保持不变,“油菜花”也就无需修改。

// 蝴蝶
public class Butterfly implements Pollinatable {

  // 传粉
  @Override
  public void pollinate() {
    // this.takeNectar();
    this.pursueFragrance();
  }

  // 享用蜜汁
  public void takeNectar() {}

  // 追逐花香
  public void pursueFragrance() {}

}

  桥接模式以建立松散的类间耦合关系著称。它是接下来为您介绍的几种模式的思想基础。

posted on 2025-03-28 22:04  星辰河岳  阅读(18)  评论(0)    收藏  举报