动机:
当一个对象有了两个变化的维度,如何应对这种“多维度的变化”?如何利用面向对象技术来使得这个对象类型可以轻松沿着多个方向变化,而不引入额外的复杂度?
意图:
将抽象部分与实现部分分离,使它们都可以独立地变化。
出自:《设计模式》GoF
Bridge模式的几个要点:
1、Bridge模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象(Tank的型号)和实现(不现的平台)可以沿着各处的维度来变化。
2、所谓抽象和实现沿着各处纬度的变化,即“子类化”它们,比如不同的Tank型号子类,和不同的平台子类。得到各个子类之后,便可以任意组它们,从而获得不同平台上的不同型号。
3、Bridge模式有时候类似于多继承方案,但是多继承方案往往违背单一职责原则(即一个类只有一个变化的原因),复用性比较差。Bridge模式是比多方案更好的解决方法。
4、Bridge模式的应用一般在“两个非常强的变化维度,有时候即使有两个变化的维度,但是某个方向的变化维度并不剧烈,换言之两个不会导致纵横交错的结果,并不一定要使用Bridge模式。
稳定部分:

变化部分:
1
using System;
2
3
4
namespace Bridge
5
{
6
/// <summary>
7
/// TankA 的摘要说明。
8
/// </summary>
9
//型号维度的变化
10
public class T50 : Tank
11
{
12
string to;
13
public T50(TankPlatFormImplementation tankImpl) : base(tankImpl)
14
{
15
16
}
17
public override void Shot()
18
{
19
//T50
20
TankImpl.DrawTank();
21
TankImpl.DoShot();
22
TankImpl.MoveTankTo(to);
23
}
24
public override void Run()
25
{
26
//T50
27
TankImpl.DrawTank();
28
TankImpl.DoShot();
29
TankImpl.MoveTankTo(to);
30
Console.Write("T50"+TankImpl.GetType()+"\n");
31
}
32
public override void Stop()
33
{
34
//T50
35
TankImpl.DrawTank();
36
TankImpl.DoShot();
37
TankImpl.MoveTankTo(to);
38
}
39
}
40
41
public class T75 : Tank
42
{
43
string to;
44
public T75(TankPlatFormImplementation tankImpl) : base(tankImpl)
45
{
46
//T75
47
TankImpl.DrawTank();
48
TankImpl.DoShot();
49
TankImpl.MoveTankTo(to);
50
}
51
public override void Shot()
52
{
53
//T75
54
TankImpl.DrawTank();
55
TankImpl.DoShot();
56
TankImpl.MoveTankTo(to);
57
}
58
public override void Run()
59
{
60
//T75
61
TankImpl.DrawTank();
62
TankImpl.DoShot();
63
TankImpl.MoveTankTo(to);
64
Console.Write("T75"+TankImpl.GetType()+"\n");
65
}
66
public override void Stop()
67
{
68
//T75
69
TankImpl.DrawTank();
70
TankImpl.DoShot();
71
TankImpl.MoveTankTo(to);
72
}
73
}
74
75
public class T90 : Tank
76
{
77
string to;
78
public T90(TankPlatFormImplementation tankImpl) : base(tankImpl)
79
{
80
//T90
81
TankImpl.DrawTank();
82
TankImpl.DoShot();
83
TankImpl.MoveTankTo(to);
84
}
85
public override void Shot()
86
{
87
//T90
88
TankImpl.DrawTank();
89
TankImpl.DoShot();
90
TankImpl.MoveTankTo(to);
91
}
92
public override void Run()
93
{
94
//T90
95
TankImpl.DrawTank();
96
TankImpl.DoShot();
97
TankImpl.MoveTankTo(to);
98
Console.Write("T90"+TankImpl.GetType()+"\n");
99
}
100
public override void Stop()
101
{
102
//T90
103
TankImpl.DrawTank();
104
TankImpl.DoShot();
105
TankImpl.MoveTankTo(to);
106
}
107
}
108
109
//平台维度的变化
110
public class PCTankImplementation : TankPlatFormImplementation
111
{
112
public override void MoveTankTo(string to)
113
{
114
115
}
116
public override void DrawTank()
117
{
118
Console.Write("PCTankImplementation \n");
119
120
}
121
public override void DoShot()
122
{
123
124
}
125
}
126
127
public class MobileTankImplementation : TankPlatFormImplementation
128
{
129
public override void MoveTankTo(string to)
130
{
131
132
}
133
public override void DrawTank()
134
{
135
136
Console.Write("MobileTankImplementation \n");
137
138
}
139
public override void DoShot()
140
{
141
142
}
143
}
144
145
}
146

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

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

主程序:
1
using System;
2
3
4
namespace Bridge
5
{
6
/// <summary>
7
/// Class1 的摘要说明。
8
/// </summary>
9
class Class1
10
{
11
/// <summary>
12
/// 应用程序的主入口点。
13
/// </summary>
14
[STAThread]
15
static void Main(string[] args)
16
{
17
//用于多个维度变化的对象
18
19
//变化点
20
//Mobile T50 的组合
21
TankPlatFormImplementation TankImpl = new MobileTankImplementation();
22
T50 tank = new T50(TankImpl);
23
tank.Run();
24
//PC T90 的组合
25
TankPlatFormImplementation TankImp = new PCTankImplementation();
26
T90 tank1 = new T90(TankImp);
27
tank1.Run();
28
Console.ReadLine();
29
}
30
}
31
}
32
33

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
