当前位置: 移动技术网 > IT编程>开发语言>c# > 简单了解C#设计模式编程中的桥接模式

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

2019年07月18日  | 移动技术网IT编程  | 我要评论
桥接模式的概念 定义:将抽象部分与实现部分分离,使它们都可以独立的变化。 理解:为啦解决一个对象变化而影响多个对象跟着变化,需要把具体实现对象抽象化,使降低对象和变化因

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

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

举例:

手机系统的生态圈问题:

啰嗦点:众所周知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);
      }
    }
       
  }


如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

  • 如何使用C# 捕获进程输出

    intro很多时候我们可能会需要执行一段命令获取一个输出,遇到的比较典型的就是之前我们需要用 ffmpeg 实现视频的编码压缩水印等一系列操作,当时使用的是 f... [阅读全文]
  • 全面分析c# LINQ

    大家好,这是 [c#.net 拾遗补漏] 系列的第 08 篇文章,今天讲 c# 强大的 linq 查询。linq 是我最喜欢的 c# 语言特性之一。linq 是... [阅读全文]
  • C# DataTable常见用法汇总

    c# datatable 的常见用法:(1)新建数据表。(2)向表添加列。(3)设置表特定行与列的数据值。(4)将某行数据加入到表。(5)合并表。(6)复制表。... [阅读全文]
  • C# 如何解析获取Url参数值

    今天遇到一个需求,需要处理通过接口传过来的一个参数,参数内容为一个拼接好的url地址,且该地址还会携带了一些额外的参数,包括但不限于数字,字符串,json串。样... [阅读全文]
  • C# 实现dataGridView选中一行右键出现菜单的示例代码

    在窗体中添加datagridview控件和contextmenustrip1控件,修改datagridview属性,将contextmenustrip控件绑定d... [阅读全文]
  • WPF实现手风琴式轮播图切换效果

    WPF实现手风琴式轮播图切换效果

    本文实例为大家分享了wpf实现轮播图切换效果的具体代码,供大家参考,具体内容如下实现效果如下:步骤:1、自定义控件myimagecontrol实现图片的裁切和动... [阅读全文]
  • WPF实现3D翻牌式倒计时特效

    WPF实现3D翻牌式倒计时特效

    本文实例为大家分享了wpf实现3d翻牌式倒计时的具体代码,供大家参考,具体内容如下实现效果如下:思路:使用自定义控件,设置一个背板 mycardcontrolb... [阅读全文]
  • WPF实现平面三角形3D运动效果

    WPF实现平面三角形3D运动效果

    本文实例为大家分享了wpf实现平面三角形3d运动效果的具体代码,供大家参考,具体内容如下实现效果如下:思路:封装三角形三个顶点和路径的三角形类,图形渲染时同步更... [阅读全文]
  • WPF实现3D粒子波浪效果

    WPF实现3D粒子波浪效果

    本文实例为大家分享了wpf实现3d粒子波浪效果的具体代码,供大家参考,具体内容如下实现效果如下:步骤:1、3d粒子类particle.cs2、粒子系统parti... [阅读全文]
  • 谈谈c#中的索引器

    概念索引器(indexer) 允许类中的对象可以像数组那样方便、直观的被引用。当为类定义一个索引器时,该类的行为就会像一个 虚拟数组(virtual array... [阅读全文]
验证码:
移动技术网