Bridge桥接(结构型模式)
动机:
当一个对象有了两个变化的维度,如何应对这种“多维度的变化”?如何利用面向对象技术来使得这个对象类型可以轻松沿着多个方向变化,而不引入额外的复杂度?
意图:
将抽象部分与实现部分分离,使它们都可以独立地变化。
出自:《设计模式》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
using System;2

3

4
namespace Bridge5
{6
/// <summary>7
/// TankA 的摘要说明。8
/// </summary>9
//型号维度的变化10
public class T50 : Tank11
{12
string to;13
public T50(TankPlatFormImplementation tankImpl) : base(tankImpl)14
{15

16
}17
public override void Shot()18
{19
//T5020
TankImpl.DrawTank();21
TankImpl.DoShot();22
TankImpl.MoveTankTo(to);23
}24
public override void Run()25
{26
//T5027
TankImpl.DrawTank();28
TankImpl.DoShot();29
TankImpl.MoveTankTo(to);30
Console.Write("T50"+TankImpl.GetType()+"\n");31
}32
public override void Stop()33
{34
//T5035
TankImpl.DrawTank();36
TankImpl.DoShot();37
TankImpl.MoveTankTo(to);38
}39
}40

41
public class T75 : Tank42
{43
string to;44
public T75(TankPlatFormImplementation tankImpl) : base(tankImpl)45
{46
//T7547
TankImpl.DrawTank();48
TankImpl.DoShot();49
TankImpl.MoveTankTo(to);50
}51
public override void Shot()52
{53
//T7554
TankImpl.DrawTank();55
TankImpl.DoShot();56
TankImpl.MoveTankTo(to);57
}58
public override void Run()59
{60
//T7561
TankImpl.DrawTank();62
TankImpl.DoShot();63
TankImpl.MoveTankTo(to);64
Console.Write("T75"+TankImpl.GetType()+"\n");65
}66
public override void Stop()67
{68
//T7569
TankImpl.DrawTank();70
TankImpl.DoShot();71
TankImpl.MoveTankTo(to);72
}73
}74

75
public class T90 : Tank76
{77
string to;78
public T90(TankPlatFormImplementation tankImpl) : base(tankImpl)79
{80
//T9081
TankImpl.DrawTank();82
TankImpl.DoShot();83
TankImpl.MoveTankTo(to);84
}85
public override void Shot()86
{87
//T9088
TankImpl.DrawTank();89
TankImpl.DoShot();90
TankImpl.MoveTankTo(to);91
}92
public override void Run()93
{94
//T9095
TankImpl.DrawTank();96
TankImpl.DoShot();97
TankImpl.MoveTankTo(to);98
Console.Write("T90"+TankImpl.GetType()+"\n");99
}100
public override void Stop()101
{102
//T90103
TankImpl.DrawTank();104
TankImpl.DoShot();105
TankImpl.MoveTankTo(to);106
}107
}108

109
//平台维度的变化110
public class PCTankImplementation : TankPlatFormImplementation111
{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 : TankPlatFormImplementation128
{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

主程序:
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
using System;2

3

4
namespace Bridge5
{6
/// <summary>7
/// Class1 的摘要说明。8
/// </summary>9
class Class110
{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



浙公网安备 33010602011771号