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


主程序:
 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

原文地址:https://www.cnblogs.com/walker/p/479610.html