• 设计模式之桥接模式


      1,多重继承变化封装

      2,桥接模式:解决多维度的变化

      有一个手机抽象类如下:

     1     /// <summary>
     2     /// 抽象父类
     3     /// </summary>
     4     public abstract class BasePhone
     5     {
     6         /// <summary>
     7         /// 操作系统
     8         /// </summary>
     9         public abstract string System();
    10 
    11         /// <summary>
    12         /// 系统版本
    13         /// </summary>
    14         public abstract string Version();
    15         /// <summary>
    16         /// 打电话
    17         /// </summary>
    18         public abstract void Call();
    19         /// <summary>
    20         /// 发短信
    21         /// </summary>
    22         public abstract void Text();
    23     }

      (1)现在我们想要一个iPhone和Galaxy,则需要代码如下:

     1  public class iPhone : BasePhone
     2     {
     3         public override string System()
     4         {
     5             return "IOS";
     6         }
     7         public override string Version()
     8         {
     9             return "9.3";
    10         }
    11         public override void Call()
    12         {
    13             Console.WriteLine("Use OS{0}.{1}.{2} Call", this.GetType().Name, this.System(), this.Version());
    14         }
    15 
    16         public override void Text()
    17         {
    18             Console.WriteLine("Use OS{0}.{1}.{2} Text", this.GetType().Name, this.System(), this.Version());
    19         }
    20     }
    21 
    22     public class Galaxy:BasePhone
    23     {
    24         public override string System()
    25         {
    26             return "Android";
    27         }
    28 
    29         public override string Version()
    30         {
    31             return "6.0";
    32         }
    33 
    34         public override void Call()
    35         {
    36             Console.WriteLine("Use OS{0}.{1}.{2} Call", this.GetType().Name, this.System(), this.Version());
    37         }
    38 
    39         public override void Text()
    40         {
    41             Console.WriteLine("Use OS{0}.{1}.{2} Text", this.GetType().Name, this.System(), this.Version());
    42         }
    43     }

      调用如下:

     1             {
     2                 BasePhone phone=new iPhone();
     3                 phone.Call();
     4                 phone.Text();
     5             }
     6             {
     7                 BasePhone phone=new Galaxy();
     8                 phone.Call();
     9                 phone.Text();
    10             }

      (2)如果现在我们想要刷机,将iPhone手机装Android系统,将Galaxy装IOS系统,则需要代码如下:

     1   /// <summary>
     2     /// 使用Android系统的iPhone手机
     3     /// </summary>
     4     public class iPhoneAndroid:BasePhone
     5     {
     6         public override string System()
     7         {
     8             return "Android";
     9         }
    10 
    11         public override string Version()
    12         {
    13             return "6.0";
    14         }
    15 
    16         public override void Call()
    17         {
    18             Console.WriteLine("Use OS{0}.{1}.{2} Call", this.GetType().Name, this.System(), this.Version());
    19         }
    20 
    21         public override void Text()
    22         {
    23             Console.WriteLine("Use OS{0}.{1}.{2} Text", this.GetType().Name, this.System(), this.Version());
    24         }
    25     }
    26 
    27     public class GalaxyIOS : BasePhone
    28     {
    29         public override string System()
    30         {
    31             return "IOS";
    32         }
    33         public override string Version()
    34         {
    35             return "9.3";
    36         }
    37         public override void Call()
    38         {
    39             Console.WriteLine("Use OS{0}.{1}.{2} Call", this.GetType().Name, this.System(), this.Version());
    40         }
    41 
    42         public override void Text()
    43         {
    44             Console.WriteLine("Use OS{0}.{1}.{2} Text", this.GetType().Name, this.System(), this.Version());
    45         }
    46     }

      如果还有其它系统的手机,比如WinPhone,则每一款手机将会有iPhone,iPhoneAndroid,iPhoneWinPhone,如果操作系统为M,手机类型为N,则需要多的类的个数为M*N,随着系统和手机类型的增加,将会造成类泛滥,所以现在将变化进行封装,

      (3)桥接模式

      代码如下:

     1     public interface ISystem
     2     {
     3         string System();
     4         string Version();
     5     }
     6 
     7     public class AndroidSystem : ISystem
     8     {
     9         public string System()
    10         {
    11             return "Android";
    12         }
    13         public string Version()
    14         {
    15             return "6.0";
    16         }
    17     }
    18 
    19     public class IOSSystem: ISystem
    20     {
    21         public string System()
    22         {
    23             return "IOS";
    24         }
    25         public string Version( )
    26         {
    27             return "9.3";
    28         }
    29     }
    30 
    31     public class WinphoneSystem : ISystem
    32     {
    33         public string System()
    34         {
    35             return "Winphone";
    36         }
    37         public string Version()
    38         {
    39             return "10.0";
    40         }
    41     }

      BasePhoneBridge:

     1     /// <summary>
     2     /// 抽象父类
     3     /// </summary>
     4     public abstract class BasePhoneBridge
     5     {
     6         /// <summary>
     7         /// 操作系统
     8         /// </summary>
     9         public ISystem SystemVersion { get; set; }
    10         ///// <summary>
    11         ///// 操作系统
    12         ///// </summary>
    13         //public abstract string System();
    14 
    15         ///// <summary>
    16         ///// 系统版本
    17         ///// </summary>
    18         //public abstract string Version();
    19         /// <summary>
    20         /// 打电话
    21         /// </summary>
    22         public abstract void Call();
    23         /// <summary>
    24         /// 发短信
    25         /// </summary>
    26         public abstract void Text();
    27     }
    GalaxyBridge:
     1     public class GalaxyBridge : BasePhoneBridge
     2     {
     3         public override void Call()
     4         {
     5             Console.WriteLine("Use OS{0}.{1}.{2} Call", this.GetType().Name, this.SystemVersion.System(), this.SystemVersion.Version());
     6         }
     7         public override void Text()
     8         {
     9             Console.WriteLine("Use OS{0}.{1}.{2} Text", this.GetType().Name, this.SystemVersion.System(), this.SystemVersion.Version());
    10         }
    11     }

      iPhoneBridge :

     1     public class iPhoneBridge : BasePhoneBridge
     2     {
     3         public override void Call()
     4         {
     5             Console.WriteLine("Use OS{0}.{1}.{2} Call", this.GetType().Name, this.SystemVersion.System(), this.SystemVersion.Version());
     6         }
     7         public override void Text()
     8         {
     9             Console.WriteLine("Use OS{0}.{1}.{2} Text", this.GetType().Name, this.SystemVersion.System(), this.SystemVersion.Version());
    10         }
    11     }

      LumiaBridge:

     1     public class LumiaBridge : BasePhoneBridge
     2     {
     3         public override void Call()
     4         {
     5             Console.WriteLine("Use OS{0}.{1}.{2} Call", this.GetType().Name, this.SystemVersion.System(), this.SystemVersion.Version());
     6         }
     7         public override void Text()
     8         {
     9             Console.WriteLine("Use OS{0}.{1}.{2} Text", this.GetType().Name, this.SystemVersion.System(), this.SystemVersion.Version());
    10         }
    11     }

      调用方式:

     1             Console.WriteLine("**************Bridge***************");
     2             ISystem android = new AndroidSystem();
     3             ISystem ios = new IOSSystem();
     4             ISystem winphone = new WinphoneSystem();
     5             {
     6                 BasePhoneBridge phone = new GalaxyBridge();
     7                 phone.SystemVersion = android;
     8                 phone.Call();
     9                 phone.Text();
    10             }
    11             {
    12                 BasePhoneBridge phone = new GalaxyBridge();
    13                 phone.SystemVersion = ios;
    14                 phone.Call();
    15                 phone.Text();
    16             }
    17             {
    18                 BasePhoneBridge phone = new GalaxyBridge();
    19                 phone.SystemVersion = winphone;
    20                 phone.Call();
    21                 phone.Text();
    22             }    

      效果:

      此时,子类数量为操作系统M+手机类型N 个。

      桥接模式缺点:使用麻烦,对于上端来说需要了解更多细节(需要知道怎么初始化操作系统)

  • 相关阅读:
    用 HTML 格式导出 Excel 时,如何保留显示网格线
    [转载] 让SciTE能够和IDE一样进行成员提示
    RedHat 上安装多个 mysql 实例并配置 django 连接的操作记录
    我的 SciTEGlobal.properties 配置文件
    FrameSet 不能支持透明
    RedHat 上安装 lighttpd 并配置 fastcgi + django 的记录
    系统设计与开发 辅助工具大集成终结版
    SQL Server Management Object(SMO)大大简化数据库工具的开发 几行代码开发功能强大的SQL工具
    Enterprise Solution 解决方案与源代码下载
    LLBL Gen 实体映射工具技术原理剖析
  • 原文地址:https://www.cnblogs.com/shangec/p/10284897.html
Copyright © 2020-2023  润新知