http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 6300|回复: 4

[学习心得] C#代理模式

[复制链接]
发表于 2019-1-7 15:03:15 | 显示全部楼层 |阅读模式
本帖最后由 惜 于 2019-1-7 15:03 编辑

一 、  代理 (Proxy ) 模式

      代理(Proxy)模式给某一个对象提供一个代理,并由代理对象控制对原对象的引用。

      代理模式的英文叫做 Proxy 或 Surrogate,中文都可译成"代理"。所谓代理,就是一个人或者一个机构代表另
一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以
在客户端和目标对象之间起到中介的作用。


二 、  代理的种类

如果按照使用目的来划分,代理有以下几种:

  远程 (Remote) ) 代理 :为一个位于不同的地址空间的对象提供一个局域代表对象。这个不同的地址空间可以是在本机器中,也可是在另一台机器中。远程代理又叫做大使(Ambassador)。

  虚拟 (Virtual ) 代理 :根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建。

  Copy-on-Write  代理 :虚拟代理的一种。把复制(克隆)拖延到只有在客户端需要时,才真正采取行动。

  保护 (Protect or Access ) 代理 :控制对一个对象的访问,如果需要,可以给不同的用户提供不同级别的使用权限。

  Cache  代理 :为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。

  防火墙 (Firewall ) 代理 :保护目标,不让恶意用户接近。

  同步化 (Synchronization ) 代理 :使几个用户能够同时使用一个对象而没有冲突。

  智能引用 (Smart Reference) ) 代理 :当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来等。

      在所有种类的代理模式中,虚拟(Virtual)代理、远程(Remote)代理、智能引用代理(Smart Reference Proxy)
和保护(Protect or Access)代理是最为常见的代理模式。

三 、  远程代理的例子

      Achilles 是一个用来测试网站的安全性能的工具软件。Achilles 相当于位于客户端的的一个桌面代理服务
器,在一个 HTTP 过程里起到一个中间人的作用,但是 Achilles 与通常的代理服务器又有不同。Achilles 截获
双向的通信数据,使得 Achilles 软件的用户可以改变来自和发往网络服务器的数据,甚至可以拦截并修改 SSL
通讯。

另外一个例子就是 Windows 的快捷方式。快捷方式是它所引用的程序的一个代理。

四 、  代理模式的结构

代理模式的类图如下图所示:

1.png

代理模式所涉及的角色有:

抽象主题角色(Subject):声明了真实主题和代理主题的共同接口,这样一来在任何使用真实主题的地方都可
以使用代理主题。

代理主题(Proxy)角色:代理主题角色内部含有对真是主题的引用,从而可以在任何时候操作真实主题对象;
代理主题角色提供一个与真实主题角色相同的接口,以便可以在任何时候都可以替代真实主体;控制真实主题的
应用,负责在需要的时候创建真实主题对象(和删除真实主题对象);代理角色通常在将客户端调用传递给真实
的主题之前或之后,都要执行某个操作,而不是单纯的将调用传递给真实主题对象。

真实主题角色(RealSubject)角色:定义了代理角色所代表的真实对象。

五 、  代理模式示例性代码

以下示例性代码实现了代理模式:

[C#] 纯文本查看 复制代码
using System;
// "Subject"
abstract class Subject
{
// Methods
public abstract void Request();
}
// "RealSubject"
class RealSubject : Subject
{
// Methods
public override void Request()
{
Console.WriteLine("Called RealSubject.Request()");
}
}
// "Proxy"
class Proxy : Subject
{
// Fields
RealSubject realSubject;
// Methods
public override void Request()
{
// Uses "lazy initialization"
if (realSubject == null)
realSubject = new RealSubject();
preRequest();
realSubject.Request();
postRequest();
}
public void preRequest()
{ Console.WriteLine("PreRequest."); }
public void postRequest()
{ Console.WriteLine("PostRequest."); }
}
/// <summary>
/// Client test
/// </summary>
public class Client
{
public static void Main(string[] args)
{
// Create proxy and request a service
Proxy p = new Proxy();
p.Request();
}
}


七 、  不同类型的代理模式

远程代理
可以将网络的细节隐藏起来,使得客户端不必考虑网络的存在。客户完全可以认为被代理的对象是局域的而不是
远程的,而代理对象承担了大部分的网络通信工作,远程代理的结构图如下图所示。

虚拟代理
使用虚拟代理模式的优点就是代理对象可以在必要的时候才将被代理的对象加载。代理可以对加载的过程加以必
要的优化。当一个模块的加载十分耗费资源的时候,虚拟代理的优点就非常明显。

保护代理
保护代理可以在运行时间对用户的有关权限进行检查,然后在核实后决定将调用传递给被代理的对象。

智能引用代理
在访问一个对象时可以执行一些内务处理(Housekeeping)操作,比如计数操作等。

八 、  代理模式实际应用的例子

该例子演示了利用远程代理模式提供对另外一个应用程序域(AppDomain)的对象进行访问控制。

[C#] 纯文本查看 复制代码
// Proxy pattern -- Real World example
using System;
using System.Runtime.Remoting;
// "Subject"
public interface IMath
{
// Methods
double Add(double x, double y);
double Sub(double x, double y);
double Mul(double x, double y);
double Div(double x, double y);
}
// "RealSubject"
class Math : MarshalByRefObject, IMath
{
// Methods
public double Add(double x, double y) { return x + y; }
public double Sub(double x, double y) { return x - y; }
public double Mul(double x, double y) { return x * y; }
public double Div(double x, double y) { return x / y; }
}
// Remote "Proxy Object"
class MathProxy : IMath
{
// Fields
Math math;
// Constructors
public MathProxy()
{
// Create Math instance in a different AppDomain
AppDomain ad = AppDomain.CreateDomain("MathDomain", null, null);
ObjectHandle o = ad.CreateInstance("Proxy_RealWorld", "Math", false,
System.Reflection.BindingFlags.CreateInstance, null, null, null, null, null);
math = (Math)o.Unwrap();
}
// Methods
public double Add(double x, double y)
{
return math.Add(x, y);
}
public double Sub(double x, double y)
{
return math.Sub(x, y);
}
public double Mul(double x, double y)
{
return math.Mul(x, y);
}
public double Div(double x, double y)
{
return math.Div(x, y);
}
}
/// <summary>
/// ProxyApp test
/// </summary>
public class ProxyApp
{
public static void Main(string[] args)
{
// Create math proxy
MathProxy p = new MathProxy();
// Do the math
Console.WriteLine("4 + 2 = {0}", p.Add(4, 2));
Console.WriteLine("4 - 2 = {0}", p.Sub(4, 2));
Console.WriteLine("4 * 2 = {0}", p.Mul(4, 2));
Console.WriteLine("4 / 2 = {0}", p.Div(4, 2));
}
}

4.png


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2019-1-7 16:56:03 | 显示全部楼层
强烈支持楼主ing……
发表于 2019-1-7 17:19:04 | 显示全部楼层
强烈支持楼主ing……
发表于 2019-1-7 17:27:32 | 显示全部楼层
我只是路过打酱油的。
发表于 2019-1-7 17:30:19 | 显示全部楼层
真是难得给力的帖子啊。
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-4-20 09:29

© 2014-2021

快速回复 返回顶部 返回列表