桥接模式在实际应用中,相比模板方法更为常见。在现实应用情况中,我们面对的是各种各样关系的维度,通过拼接不同维度能方便地实现不同功能,然而给我们的代码带来不少麻烦。一般地,我们面对关系复杂的维度,通常会使用树及林,其结果就是整片代码复杂的继承关系(有时也浪费了这个继承),桥接模式似乎能解决这个问题。


  • 举例

    惯例,不想画类图,直接上代码。

我们如何用代码表述“一件某品牌的某商品”?
一般地,我们会如此表述:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Goods {
public void content() {
System.out.println("这是一件商品!");
}
}
class LifeGoods extends Goods {
public void content() {
System.out.println("这是一件生活用品!");
}
}
class OfficialGoods extends Goods {
public void content() {
System.out.println("这是一件办公用品!");
}
}
class Brand1LifeGoods extends LifeGoods {
public void content() {
System.out.println("这是一件品牌1产的生活用品!");
}
}
class Brand2LifeGoods extends LifeGoods {public void content() {
System.out.println("这是一件品牌2产的生活用品!");
}}
class Brand1OfficialGoods extends OfficialGoods {
public void content() {
System.out.println("这是一件品牌1产的办公用品!");
}
}
class Brand2OfficialGoods extends OfficialGoods {
public void content() {
System.out.println("这是一件品牌1产的办公用品!");
}
}

yep!!!你没看错,就是这么恶心的继承关系,类图可以自己想象。
用桥接模式大概会成什么样呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
abstract class Goods {
protected Brand brand;
public void setBrand(Brand brand) {
this.brand = brand;
}
public void content() {
brand.content();
System.out.println("商品!");
}
}
class LifeGoods extends Goods {
public void content() {
brand.content();
System.out.println("生活用品!");
}
}
class OfficialGoods extends Goods {
public void content() {
brand.content();
System.out.println("办公用品!");
}
}
/* ========================================= */
abstract class Brand {
public void content() {
System.out.println("这是一件");
}
}
class Brand1 extends Brand {
public void content() {
System.out.println("这是一件品牌1产的");
}
}
class Brand2 extends Brand {
public void content() {
System.out.println("这是一件品牌2产的");
}
}

so?!用聚合!

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Bridge {
public static void main(String[] args) {
Goods goods = new LifeGoods();
goods.setBrand(new Brand1());
goods.content();
goods.setBrand(new Brand2());
goods.content();
goods = new OfficialGoods();
goods.setBrand(new Brand2());
goods.content();
}
}

print >>>

1
2
3
这是一件品牌1产的生活用品!
这是一件品牌2产的生活用品!
这是一件品牌2产的办公用品!

显然桥接少了一堆的继承关系,客体之间更加清晰,降低了耦合。聚合后的Bridge类相比Brand1LifeGoods之类,前者留出了唯一的继承位置,可以让我们的Bridge做更多的事儿。