使用代理模式来进行C#设计模式开发的基础教程

 更新时间:2016年02月23日 09:20:44   作者:saville  
这篇文章主要介绍了使用代理模式来进行C#设计模式开发的基础教程,代理模式主张在客户端和目标对象中间建立中介来降低程序设计的耦合度,需要的朋友可以参考下

一、概述
在软件开发中,有些对象由于创建成本高、访问时需要与其它进程交互等原因,直接访问会造成系统速度慢、复杂度增大等问题。这时可以使用代理模式,给系统增加一层间接层,通过间接层访问对象,从而达到隐藏系统复杂性、提高系统性能的目的。
二、代理模式的详细介绍
代理模式为其他对象提供一种代理以控制对这个对象的访问。其结构图如下:

201622392005225.gif (405×252)

Subject定义了RealSubject和Proxy共用的接口,使得在任何使用RealSubject的地方都可以使用Proxy
RealSubject定义了Proxy所代表的实体。
Proxy定义了一个控制RealSubject的代理,供Client使用。
代理模式按照使用目的可以分为以下几种:

  • 远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代表对象。这个不同的地址空间可以是本电脑中,也可以在另一台电脑中。最典型的例子就是——客户端调用Web服务或WCF服务。
  • 虚拟(Virtual)代理:根据需要创建一个资源消耗较大的对象,使得对象只在需要时才会被真正创建。
  • Copy-on-Write代理:虚拟代理的一种,把复制(或者叫克隆)拖延到只有在客户端需要时,才真正采取行动。
  • 保护(Protect or Access)代理:控制一个对象的访问,可以给不同的用户提供不同级别的使用权限。
  • 防火墙(Firewall)代理:保护目标不让恶意用户接近。
  • 智能引用(Smart Reference)代理:当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来等。
  • Cache代理:为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以这些结果。

在上面所有种类的代理模式中,虚拟代理、远程代理、智能引用代理和保护代理较为常见的代理模式。下面让我们具体看看代理模式的具体定义。

2.1 定义
代理模式——就是给某一个对象提供一个代理,并由代理对象控制对原对象的引用。在一些情况下,一个客户不想或者不能直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。例如电脑桌面的快捷方式就是一个代理对象,快捷方式是它所引用的程序的一个代理。

2.2 代理模式实现
看完代理模式的描述之后,下面以一个生活中的例子来解释下代理模式,在现实生活中,如果有同事出国或者朋友出国的情况下,我们经常会拖这位朋友帮忙带一些电子产品或化妆品等东西,这个场景中,出国的朋友就是一个代理,他(她)是他(她)朋友的一个代理,由于他朋友不能去国外买东西,他却可以,所以朋友们都托他帮忙带一些东西的。下面就以这个场景来实现下代理模式,具体代码如下:

// 客户端调用
  class Client
  {
    static void Main(string[] args)
    {
      // 创建一个代理对象并发出请求
      Person proxy = new Friend();
      proxy.BuyProduct();
      Console.Read();
    }
  }
  // 抽象主题角色
  public abstract class Person
  {
    public abstract void BuyProduct();
  }
  //真实主题角色
  public class RealBuyPerson : Person
  {
    public override void BuyProduct()
    {
      Console.WriteLine("帮我买一个IPhone和一台苹果电脑");
    }
  }
  // 代理角色
  public class Friend:Person
  {
    // 引用真实主题实例
    RealBuyPerson realSubject;
    public override void BuyProduct()
    {
      Console.WriteLine("通过代理类访问真实实体对象的方法");
      if (realSubject == null)
      {
        realSubject = new RealBuyPerson();
      }
      this.PreBuyProduct();
      // 调用真实主题方法
      realSubject.BuyProduct();
      this.PostBuyProduct();
    }
    // 代理角色执行的一些操作
    public void PreBuyProduct()
    {
      // 可能不知一个朋友叫这位朋友带东西,首先这位出国的朋友要对每一位朋友要带的东西列一个清单等
      Console.WriteLine("我怕弄糊涂了,需要列一张清单,张三:要带相机,李四:要带Iphone...........");
    }
             
    // 买完东西之后,代理角色需要针对每位朋友需要的对买来的东西进行分类
    public void PostBuyProduct()
    {
      Console.WriteLine("终于买完了,现在要对东西分一下,相机是张三的;Iphone是李四的..........");
    }
  }

在上面的代码中都有相应的注释,这里也不多解释了。

三、代理模式的优缺点
全面分析完代理模式之后,让我们看看这个模式的优缺点:

优点:

代理模式能够将调用用于真正被调用的对象隔离,在一定程度上降低了系统的耦合度;
代理对象在客户端和目标对象之间起到一个中介的作用,这样可以起到对目标对象的保护。代理对象可以在对目标对象发出请求之前进行一个额外的操作,例如权限检查等。
缺点:

由于在客户端和真实主题之间增加了一个代理对象,所以会造成请求的处理速度变慢
实现代理类也需要额外的工作,从而增加了系统的实现复杂度。

相关文章

  • C#中out与ref的区别实例解析

    C#中out与ref的区别实例解析

    这篇文章主要介绍了C#中out与ref的区别实例解析,对C#初学者有不错的学习借鉴价值,需要的朋友可以参考下
    2014-08-08
  • C#实现判断文件夹存在与否并创建文件夹的方法

    C#实现判断文件夹存在与否并创建文件夹的方法

    这篇文章主要介绍了C#实现判断文件夹存在与否并创建文件夹的方法,涉及C#针对文件及目录的判断与创建操作相关技巧,需要的朋友可以参考下
    2017-02-02
  • C#获取串口列表实现实时监控串口

    C#获取串口列表实现实时监控串口

    本文主要介绍两种获取串口列表的方法,比较简单,方便大家使用,另外分享了一个已封装的API,需要的朋友可以参考下。
    2016-05-05
  • 利用Aspose.Cells和Excel模板导出统计数据

    利用Aspose.Cells和Excel模板导出统计数据

    这篇文章主要为大家详细介绍了利用Aspose.Cells和Excel模板导出复杂的统计数据,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • C#三种方法获取文件的Content-Type(MIME Type)

    C#三种方法获取文件的Content-Type(MIME Type)

    这篇文章介绍了C#获取文件Content-Type(MIME Type)的三种方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-01-01
  • c# 两个数组比较,将重复部分去掉,返回不重复部分的实现

    c# 两个数组比较,将重复部分去掉,返回不重复部分的实现

    下面小编就为大家带来一篇c# 两个数组比较,将重复部分去掉,返回不重复部分的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • C# PictureBox图片控件实现图片交换

    C# PictureBox图片控件实现图片交换

    在c#中可以使用PictureBox控件来呈现图像,本文主要介绍了C# PictureBox实现图片交换,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • C# async/await任务超时处理的实现

    C# async/await任务超时处理的实现

    本文主要介绍了C# async/await任务超时处理的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • Unity Shader实现动态雾效果

    Unity Shader实现动态雾效果

    这篇文章主要为大家详细介绍了Unity Shader实现动态雾效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C#图像处理之图像均值方差计算的方法

    C#图像处理之图像均值方差计算的方法

    这篇文章主要介绍了C#图像处理之图像均值方差计算的方法,涉及C#图像均值方差的计算技巧,需要的朋友可以参考下
    2015-04-04

最新评论