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