简单了解C#设计模式编程中的桥接模式

 更新时间:2020年6月25日 11:25  点击:1700

桥接模式的概念
定义:将抽象部分与实现部分分离,使它们都可以独立的变化。

理解:为啦解决一个对象变化而影响多个对象跟着变化,需要把具体实现对象抽象化,使降低对象和变化因素的耦合度,提高系统的可维护性和扩展性。

举例:

手机系统的生态圈问题:

啰嗦点:众所周知wp的生态圈相对与有些系统较差,各位需努力,诺基亚走下神坛,wp要走上神坛,顶一下哈。

wp/ios系统类:运行软件,可承载本运行环境下的任何软件,如果新增一个系统,软件就要多做一个系统的版本

weixin/kuwo软件类:开始运行软件,如果新加一块软件,就要做众多系统版本的。

实现:在iso和wp系统中运行,各种不同的软件。

类图:

2016217162841759.png (835×294)

下面我们来根据具体的代码了解桥接模式。
软件代码:

 //软件
  public interface ISoftWare
  {
    void start();
  }

  //Kuwo
  public class Kuwo : ISoftWare
  {
    public void start()
    {
      Console.WriteLine("听音乐,用酷我!");
    }
  }
  //WeiXin
  public class WeiXin : ISoftWare
  {
    public void start()
    {
      Console.WriteLine("让你我的距离更近!");
    }
  }


操作系统代码

  //操作系统,跑软件
  public abstract class System
  {
    public abstract void Run(ISoftWare software);
  }

  //Wp
  public class WinPhone : System
  {
    public override void Run(ISoftWare software)
    {
      Console.WriteLine("Winphone系统,给你想要的;");
      software.start();
    }
  }

  //Ios
  public class Ios : System
  {
    public override void Run(ISoftWare software)
    {
      Console.WriteLine("Ios系统,给你想不到的;");
      software.start();
    }
  }


客户端代码

public static void Main()
    {
      ISoftWare weixin = new WeiXin();
      ISoftWare kuwo = new Kuwo();
      //Wp系统
      System WpSys = new WinPhone();
      WpSys.Run(weixin);
      WpSys.Run(kuwo);
      //IOS系统
      System IosSys = new Ios();
      IosSys.Run(weixin);
      IosSys.Run(kuwo);

      Console.Read();
    }

桥接模式的优缺点
介绍完桥接模式,让我们看看桥接模式具体哪些优缺点。

优点:

  • 把抽象接口与其实现解耦。
  • 抽象和实现可以独立扩展,不会影响到对方。
  • 实现细节对客户透明,对用于隐藏了具体实现细节。

缺点: 增加了系统的复杂度

使用场景
我们再来看看桥接模式的使用场景,在以下情况下应当使用桥接模式:

如果一个系统需要在构件的抽象化角色和具体化角色之间添加更多的灵活性,避免在两个层次之间建立静态的联系。
设计要求实现化角色的任何改变不应当影响客户端,或者实现化角色的改变对客户端是完全透明的。
需要跨越多个平台的图形和窗口系统上。
一个类存在两个独立变化的维度,且两个维度都需要进行扩展。

一个实际应用桥接模式的例子
桥接模式也经常用于具体的系统开发中,对于三层架构中就应用了桥接模式,三层架构中的业务逻辑层BLL中通过桥接模式与数据操作层解耦(DAL),其实现方式就是在BLL层中引用了DAL层中一个引用。这样数据操作的实现可以在不改变客户端代码的情况下动态进行更换,下面看一个简单的示例代码:

// 客户端调用
  // 类似Web应用程序
  class Client
  {
    static void Main(string[] args)
    {
      BusinessObject customers = new CustomersBusinessObject("ShangHai");
      customers.Dataacces = new CustomersDataAccess();
      customers.Add("小六");
      Console.WriteLine("增加了一位成员的结果:");
      customers.ShowAll();
      customers.Delete("王五");
      Console.WriteLine("删除了一位成员的结果:");
      customers.ShowAll();
      Console.WriteLine("更新了一位成员的结果:");
      customers.Update("Learning_Hard");
      customers.ShowAll();
      Console.Read();
    }
  }
  // BLL 层
  public class BusinessObject
  {
    // 字段
    private DataAccess dataacess;
    private string city;
    public BusinessObject(string city)
    {
      this.city = city;
    }
    // 属性
    public DataAccess Dataacces
    {
      get { return dataacess; }
      set { dataacess = value; }
    }
    // 方法
    public virtual void Add(string name)
    {
      Dataacces.AddRecord(name);
    }
    public virtual void Delete(string name)
    {
      Dataacces.DeleteRecord(name);
    }
    public virtual void Update(string name)
    {
      Dataacces.UpdateRecord(name);
    }
    public virtual string Get(int index)
    {
      return Dataacces.GetRecord(index);
    }
    public virtual void ShowAll()
    {
      Console.WriteLine();
      Console.WriteLine("{0}的顾客有:", city);
      Dataacces.ShowAllRecords();
    }
  }
  public class CustomersBusinessObject : BusinessObject
  {
    public CustomersBusinessObject(string city)
      : base(city) { }
    // 重写方法
    public override void ShowAll()
    {
      Console.WriteLine("------------------------");
      base.ShowAll();
      Console.WriteLine("------------------------");
    }
  }
  /// <summary>
  /// 相当于三层架构中数据访问层(DAL)
  /// </summary>
  public abstract class DataAccess
  {
    // 对记录的增删改查操作
    public abstract void AddRecord(string name);
    public abstract void DeleteRecord(string name);
    public abstract void UpdateRecord(string name);
    public abstract string GetRecord(int index);
    public abstract void ShowAllRecords();
  }
  public class CustomersDataAccess:DataAccess
  {
    // 字段
    private List<string> customers =new List<string>();
    public CustomersDataAccess()
    {
      // 实际业务中从数据库中读取数据再填充列表
      customers.Add("Learning Hard");
      customers.Add("张三");
      customers.Add("李四");
      customers.Add("王五");
    }
    // 重写方法
    public override void AddRecord(string name)
    {
      customers.Add(name);
    }
    public override void DeleteRecord(string name)
    {
      customers.Remove(name);
    }
    public override void UpdateRecord(string updatename)
    {
      customers[0] = updatename;
    }
    public override string GetRecord(int index)
    {
      return customers[index];
    }
    public override void ShowAllRecords()
    {
      foreach (string name in customers)
      {
        Console.WriteLine(" " + name);
      }
    }
       
  }


[!--infotagslink--]

相关文章

  • C#实现简单的登录界面

    我们在使用C#做项目的时候,基本上都需要制作登录界面,那么今天我们就来一步步看看,如果简单的实现登录界面呢,本文给出2个例子,由简入难,希望大家能够喜欢。...2020-06-25
  • 浅谈C# 字段和属性

    这篇文章主要介绍了C# 字段和属性的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下...2020-11-03
  • C#中截取字符串的的基本方法详解

    这篇文章主要介绍了C#中截取字符串的的基本方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-03
  • C#实现简单的Http请求实例

    这篇文章主要介绍了C#实现简单的Http请求的方法,以实例形式较为详细的分析了C#实现Http请求的具体方法,需要的朋友可以参考下...2020-06-25
  • C#连接SQL数据库和查询数据功能的操作技巧

    本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
  • C#中new的几种用法详解

    本文主要介绍了C#中new的几种用法,具有很好的参考价值,下面跟着小编一起来看下吧...2020-06-25
  • 使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序)

    这篇文章主要介绍了使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#开发Windows窗体应用程序的简单操作步骤

    这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
  • C#从数据库读取图片并保存的两种方法

    这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
  • C#和JavaScript实现交互的方法

    最近做一个小项目不可避免的需要前端脚本与后台进行交互。由于是在asp.net中实现,故问题演化成asp.net中jiavascript与后台c#如何进行交互。...2020-06-25
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • 轻松学习C#的基础入门

    轻松学习C#的基础入门,了解C#最基本的知识点,C#是一种简洁的,类型安全的一种完全面向对象的开发语言,是Microsoft专门基于.NET Framework平台开发的而量身定做的高级程序设计语言,需要的朋友可以参考下...2020-06-25
  • C#变量命名规则小结

    本文主要介绍了C#变量命名规则小结,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-09
  • C#绘制曲线图的方法

    这篇文章主要介绍了C#绘制曲线图的方法,以完整实例形式较为详细的分析了C#进行曲线绘制的具体步骤与相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • c#自带缓存使用方法 c#移除清理缓存

    这篇文章主要介绍了c#自带缓存使用方法,包括获取数据缓存、设置数据缓存、移除指定数据缓存等方法,需要的朋友可以参考下...2020-06-25
  • c#中(&&,||)与(&,|)的区别详解

    这篇文章主要介绍了c#中(&&,||)与(&,|)的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • 经典实例讲解C#递归算法

    这篇文章主要用实例讲解C#递归算法的概念以及用法,文中代码非常详细,帮助大家更好的参考和学习,感兴趣的朋友可以了解下...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#中list用法实例

    这篇文章主要介绍了C#中list用法,结合实例形式分析了C#中list排序、运算、转换等常见操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25