第七篇 调整类间关系 第十九章 - 桥接模式
接下来的几个章节,我们一起讨论类(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() {}
}
桥接模式以建立松散的类间耦合关系著称。它是接下来为您介绍的几种模式的思想基础。
浙公网安备 33010602011771号