zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    函数调用本质
    互联网协议入门
    iOS开发系列-Block本质篇
    iOS组件化开发-CocoaPods简介
    版本控制-Git
    iOS开发系列-NSDate
    iOS开发系列-线程同步技术
    Python 抓取网页gb2312乱码问题
    常用正则表达式
    Java 命名规范
  • 原文地址:https://www.cnblogs.com/walker/p/479610.html
Copyright © 2011-2022 走看看