zoukankan      html  css  js  c++  java
  • 设计模式篇——初探桥接模式

    文章目录

    1、桥接模式介绍

    2、桥接模式类图

    3、桥接模式Demo实现(移动互联网时代的手机设计)

    4、桥接模式总结

    桥接模式介绍:

      桥接模式将变化封装,使用组合的方式将变化的抽象放到类中,属于结构形设计模式。

    类图:

    一个简单的Demo(移动互联网时代的手机设计):

      现在,我们有一个手机的抽象基类BasePhone,它有获取它的操作系统(abstract string System()),获取它的版本号(abstract string Version())和打电话(abstract void Call())三个功能。接下来,我们有三部手机,分别是Iphone,xiaomi,winphone。分别是IOS 9.0操作系统,Android 6.0操作系统,Windows 10.0操作系统。用代码来实现下。

     1     /// <summary>
     2     /// 手机抽象类
     3     /// </summary>
     4     public abstract class BasePhone
     5     {
     6         /// <summary>
     7         /// 操作系统
     8         /// </summary>
     9         /// <returns></returns>
    10         public abstract string System();
    11         /// <summary>
    12         /// 版本
    13         /// </summary>
    14         /// <returns></returns>
    15         public abstract string Version();
    16         /// <summary>
    17         /// 打电话
    18         /// </summary>
    19         public abstract void Call();
    20     }
    BasePhone
     1     /// <summary>
     2     /// 微软手机
     3     /// </summary>
     4     public class WinPhone : BasePhone
     5     {
     6         public override void Call()
     7         {
     8             Console.WriteLine($"{this.GetType().Name}手机是{this.System()}的操作系统,版本为{this.Version()}");
     9         }
    10 
    11         public override string System()
    12         {
    13             return "Windows";
    14         }
    15 
    16         public override string Version()
    17         {
    18             return "10.0";
    19         }
    20     }
    WinPhone
     1     /// <summary>
     2     /// 小米手机
     3     /// </summary>
     4     public class XiaomiPhone:BasePhone
     5     {
     6 
     7         public override string System()
     8         {
     9             return "Android";
    10         }
    11 
    12         public override string Version()
    13         {
    14             return "6.2";
    15         }
    16         public override void Call()
    17         {
    18             Console.WriteLine($"{this.GetType().Name}手机是{this.System()}的操作系统,版本为{this.Version()}");
    19         }
    20     }
    XiaomiPhone
     1     /// <summary>
     2     /// IPhone手机
     3     /// </summary>
     4     public class IPhone : BasePhone
     5     {
     6         public override string System()
     7         {
     8             return "IOS";
     9         }
    10 
    11         public override string Version()
    12         {
    13             return "9.0";
    14         }
    15 
    16         public override void Call()
    17         {
    18             Console.WriteLine($"{this.GetType().Name}手机是{this.System()}的操作系统,版本为{this.Version()}");
    19         }
    20     }
    IPhone

    接下来分别调用一下它们打电话的方法,这里打电话输出一下手机类型,操作系统和版本号。

    1             //用一台小米打电话
    2             BasePhone xiaomi = new XiaomiPhone();
    3             xiaomi.Call();
    4             //用一台Winphone打电话
    5             BasePhone winphone = new WinPhone();
    6             winphone.Call();
    7             //用一台iphone打电话
    8             BasePhone iphone = new IPhone();
    9             iphone.Call();
    显示调用Call方法

      我们知道,手机是可以刷机的,例如我们可以给我们的Winphone手机刷一个IOS操作系统。这样我们就需要实现这样一个手机类WinPhoneIOSsystem。内部方法System返回操作系统为IOS,Version返回版本好为9.0,如下所示。

     1     /// <summary>
     2     /// 微软手机
     3     /// </summary>
     4     public class WinPhoneIOSsystem : BasePhone
     5     {
     6         public override void Call()
     7         {
     8             Console.WriteLine($"{this.GetType().Name}手机是{this.System()}的操作系统,版本为{this.Version()}");
     9         }
    10 
    11         public override string System()
    12         {
    13             return "IOS";
    14         }
    15 
    16         public override string Version()
    17         {
    18             return "9.0";
    19         }
    20     }
    WinPhoneIOSsystem
    1             BasePhone winphoneWithIOS = new WinPhoneIOSsystem();
    2             winphoneWithIOS.Call();
    调用一下ios系统的winphone手机

    以这样的方式来实现,那我们可以三种手机分别刷三种系统,就需要3*3个子类。这样显然是不合适。这时候我们就可以使用桥接模式来解决这个问题。因为我们的操作系统和版本号是可以改变的,那么我们可以把它单独封装

    起来,这里使用一个接口ISystem来实现,这个接口有两个方法分别是操作系统版本和操作系统版本号。。

    1     /// <summary>
    2     /// 操作系统
    3     /// </summary>
    4     public interface ISystem
    5     {
    6         string System();
    7         string Version();
    8     }
    ISystem

    同样,分别把三个操作系统实现。

     1     /// <summary>
     2     /// 安卓操作系统
     3     /// </summary>
     4     public class Android : ISystem
     5     {
     6         public string System()
     7         {
     8             return "Android";
     9         }
    10 
    11         public string Version()
    12         {
    13             return "6.3";
    14         }
    15     
    Android
    IOS
    Windows

    这时我们修改下我们的手机基类,将操作系统和版本放到变量system中去。这个变量由子类实现时候给它初始化。

     1     /// <summary>
     2     /// 手机抽象类
     3     /// </summary>
     4     public abstract class BasePhone
     5     {
     6         /// <summary>
     7         /// 操作系统和版本号封装到Isystem接口
     8         /// </summary>
     9         public ISystem system;
    10 
    11 
    12         ///// <summary>
    13         ///// 操作系统
    14         ///// </summary>
    15         ///// <returns></returns>
    16         //public abstract string System();
    17         ///// <summary>
    18         ///// 版本
    19         ///// </summary>
    20         ///// <returns></returns>
    21         //public abstract string Version();
    22 
    23 
    24         /// <summary>
    25         /// 打电话
    26         /// </summary>
    27         public abstract void Call();
    28     }
    BasePhone

    修改后的手机子类如下所示。

     1     /// <summary>
     2     /// 小米手机
     3     /// </summary>
     4     public class XiaomiPhone:BasePhone
     5     {
     6         public override void Call()
     7         {
     8 
     9             if (this.system == null)
    10                 throw new Exception("请初始化操作系统");
    11             Console.WriteLine($"{this.GetType().Name}手机是{this.system.System()}的操作系统,版本为{this.system.Version()}");
    12         }
    13     }
    XiaomiPhone
     1     /// <summary>
     2     /// 微软手机
     3     /// </summary>
     4     public class WinPhone : BasePhone
     5     {
     6         public override void Call()
     7         {
     8 
     9             if (this.system == null)
    10                 throw new Exception("请初始化操作系统");
    11             Console.WriteLine($"{this.GetType().Name}手机是{this.system.System()}的操作系统,版本为{this.system.Version()}");
    12         }
    13     }
    WinPhone
     1     /// <summary>
     2     /// IPhone手机
     3     /// </summary>
     4     public class IPhone : BasePhone
     5     {
     6         public override void Call()
     7         {
     8             if (this.system == null)
     9                 throw new Exception("请初始化操作系统");
    10             Console.WriteLine($"{this.GetType().Name}手机是{this.system.System()}的操作系统,版本为{this.system.Version()}");
    11         }
    12     }
    IPhone

    这时候我们给一台小米手机使用IOS操作系统就能如下所示。

    此时,我们不同的“手机(实现类)”刷不同的"系统(抽象)",所需要的实现类个数为 M + N 就可以完成了。(M手机类型,N系统类型)相比之前的方式实现个数为M*N,减少了大量实现类。

    桥接模式总结

    • 桥接模式将实现予以解耦,将变化的部分独立封装起来。
    • 抽象部分和实现部分可以独立扩展,不会影响到对方。
    • 桥接模式使上端(客户端)知道了更多的细节,增加了代码的复杂度。
  • 相关阅读:
    利用itextsharp.dll 导出pdf格式文件
    Oracle 连接失去联系、链接空闲例程
    Log4net用法
    oracle 用户锁定(ORA28000:the account is locked)的解锁方法:
    智能提示框设计 仿携程
    利用System.Net.Mail 的SmtpClient发送邮件
    CTE实现嵌套递归
    读入excel中的数据到数据库中
    项目发布遇见的问题的整理
    JavaScript substring() 方法
  • 原文地址:https://www.cnblogs.com/liumengchen-boke/p/8733456.html
Copyright © 2011-2022 走看看