设计模式(13)-桥接模式

思想:将一个类的抽象定义和具体实现解耦。
场景:该 模式的典型应用场景是:一个类的抽象定义已经确定,但是,其实现代码甚至原理可能会不同。比如:我们最熟悉的图形界面中的window的 实现,无论在什么操作系统,什么平台的机器上,一个window应具有的抽象定义基本上是一致的, 但是,其实现代码肯定会因为平台不同,机器的代码指令不同而不同。此时,如果希望您写的window类 能跨平台,应用Bridge模式就是一个好主意。
实现:该 模式的实现方法很简单,就是除了定义类的抽象定义之外,将一个类的所有实现代码独立出一个实现类。这样一来,无论是抽象定义还是实现类都能分别修改和重 用,但只要两部分的交互接口不变,还是可以方便的互相组装。当然,实际上也没有必要隔离出“所有实现代码”,只需要隔离需要的部分就行了。因此,也可以 说,从代码结构来看,Builder模式是一种变种的Bridge模 式的。也经常有人将Bridge模式和接口相比较,如果隔离出所有的实现,那么的确接口的方式也能 做到抽象定义和实现分离,但是,Bridge有其优势如下:一、究竟隔离多少代码到Bridge类 中可以灵活确定,二、减少了总的类的数目,三、允许被隔离出来的Bridge类被其它的类直接共享 使用。

重构成本:中。将所有的(或很大部分)实现代码分离开来总还是一件不大,但是,也不小的事。所以标个“中”在这里。:)
Bridge桥接设计模式是将一组功能(实现)与另一组使用该功能的其他对象(行为)分离开来,以便达到单一因素变化,然后使用对象调用的方式将这两组关联系起来,将问题的行为和实现分离开来实现,通过用聚合代替继承来解决子类爆炸性增长的问题。 Bridge桥接设计模式结构如下:
这里写图片描述
还是以画图为例演示Bridge桥接设计模式,例子代码如下:

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
39
40
41
42
43
44
45
46
47
48
//行为
interface Shape{
public void doDraw();
}
class Circle implements Shape{
private Drawing draw
public Circle(Drawing draw){
this.draw = draw;
}
public void doDraw(){
draw.draw();
}
}
class Rectangle implements Shape{
private Drawing draw
public Rectangle(Drawing draw){
this.draw = draw;
}
public void doDraw(){
draw.draw();
}
}
//实现
interface Drawing{
public void draw();
}
class SolidDrawing implements Drawing{
public void draw(){
System.out.println(“Drawing solide line…”);
}
}
class DashDrawing implements Drawing{
public void draw(){
System.out.println(“Drawing dash line…”);
}
}
public class BridgeDemo{
public static void main(String[] args){
//画一个实线的圆
Drawing draw1 = new SolidDrawing();
Shape shape1 = new Circle(draw1);
shape1.doDraw();
//画一个虚线的矩形
Drawing draw2 = new DashDrawing();
Shape shape2 = new Rectangle(draw2);
shape2.doDraw();
}
}

只从上面的例子代码可能还无法完全理解Bridge桥接设计模式,上面的圆形和矩形是行为,而实线画法和虚线画法则是实现,行为接口Shape通过聚合方式引用实现接口Drawing从而达到了行为和实现的桥接。如果需要增加第三种图形三角形,则不会影响实现部分。如果增加第三种画法折线画法,则不会影响图形行为部分,将行为与实现松耦合分离。当系统有两个可变因素时,即问题行为和问题实现都在变化时,传统实现方式可能组合情况太多造成类爆炸,适合使用桥梁模式。
学习设计模式的人经常分不清Bridge桥接设计模式和Strategy策略设计模式,个人感觉两者简单的区别如下:
(1).Bridge桥接设计模式中不但实现可以变化,问题行为也是可以变化的,且两者的变化是相互独立的,在两个维度都存在变化情况下优先考虑使用桥接模式。
(2).Strategy策略设计模式中,仅仅存在算法实现策略的变化,问题行为是不变的,即仅有一个维度的变化。另外策略模式中考虑的算法层次的变化,是无状态,无数据的。
JDK中桥接模式的应用:
•AWT
•JDBC