23种设计模式--桥接模式
结构型设计模式的一种,其实是聚合关系的使用。
【DP】定义
将抽象部分与它的实现部分分离,使它们都可以独立地变化。
使用场景
多个维度都有不同的值且有变化,需要使用桥接模式将多个维度连接起来,这样就可以避免笛卡尔乘积数量的类和重复代码。
类图
该图的核心是抽象主类对维度抽象类的聚合关系,即主类包括维度。
这种设计能够避免每一个维度都有一个对应的主类对应。
举例
下面的例子能够说明问题,但是不太恰当。
假设要做图形报表,图有两种类型:折线图和柱状图,图的维度有两种:组织维度和日期维度,这里我们约定一种图只有一个维度。
那么如果按照图类型来定义类的话,需要有如下定义:
可以看到,现在需要维护很多类,而且,如果增加一种图类型或者增加一种维度类型,还需要增加很多类。
如果使用桥接模式,即对图类型和维度类型抽象,会变得无比简洁,如下所示:
具体代码实现如下: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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66/**
* 抽象图类
*/
public abstract class Graph {
public Dimension dim;
public void setDim(Dimension dim) {
this.dim = dim;
}
public abstract Object query();
}
/**
* 折线图
*/
public class LineGraph extends Graph{
public Object query() {
dim.query();
}
}
/**
* 柱状图
*/
public class HistogramGraph extends Graph{
public Object query() {
dim.query();
}
}
/**
* 抽象维度类
*/
public abstract class Dimension {
public abstract Object query();
}
/**
* 组织维度类
*/
public class OrgDimension extends Dimension {
public Object query() {
return null;
}
}
/**
* 日期维度类
*/
public class DateDimension extends Dimension {
public Object query() {
return null;
}
}
/**
* 客户端类
*/
public class Main {
public static void main() {
Dimension orgDim = new OrgDimension();
Dimension dateDim = new DateDimension();
// 举例说明组织维度的图
Graph lineGraph = new LineGraph();
lineGraph.setDim(orgDim);
Object res = lineGraph.query();
}
}
可以看到,这样在增加图类型和维度类型的时候,只需要增加相应的类即可,实现多个维度的解耦。
注意事项
- 先熟悉设计模式的六大原则,再看设计模式。在熟悉原则后,写代码时会自然而然地用到桥接模式的。