c#设计模式- Proxy模式

引用和参考文档

http://www.cnblogs.com/zhenyulu/articles/48128.html

http://tech.ddvip.com/2009-07/1246867920125399_2.html

http://wenku.baidu.com/link?url=bC6XooGTolQwVnfTyUyAhlwTXn-wBHLojsWxXaXdJP4n8ZDPJvTaJUaO1bFrQOfN_sMrWPgHd15ijQJsAjJCTu2MINpq1aeCzwlbQoPBedq


一 代理模式(Proxy)


代理(Proxy)模式支持一个对象对另一个对象的创建和访问进行控制。代理通常是个微型的(公共)对象,代表着一个复杂得多的(私有)对象,一旦所需的条件满足,对象就被激活。


二 使用代理原因


代理的主要目的之一,是把复杂性封装起来,让客户端程序在引用上更容易,而不需要顾虑藏在身后这些复杂的逻辑。

在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。


三 代理的种类

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

四 举例

例子1

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Proxy1
{
    // Abstract "Subject"
    abstract class Subject
    {
        abstract public void Request();
    }

    // "RealSubject"
    class RealSubject : Subject
    {
        public override void Request()
        {
            Console.WriteLine("Called real subject.Request()");
        }
    }

    class Proxy : Subject
    {
        RealSubject realSubject;

        public override void Request()
        {
            if (realSubject == null)
            {
                realSubject = new RealSubject();
            }

            PreRequest();
            realSubject.Request();
            PostRequest();
        }

        public void PreRequest()
        {
            Console.WriteLine("PreRequest.");
        }

        public void PostRequest()
        {
            Console.WriteLine("PostRequest.");
        }
    }

    public class Client
    {
        public static void Main(string[] args)
        {
            Proxy p1 = new Proxy();
            p1.Request();
        }
    }
}

运行结果:


例子2
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Proxy3
{
    public interface ISubject
    {
        String Request();
    }

    public class Subject
    {
        public String Request()
        {
            return "Subject request " + "Choose left door\n";
        }
    }

    public class Proxy : ISubject
    {
        Subject subject;

        public String Request()
        {
            if (subject == null)
            {
                Console.WriteLine("Subject inactive");
                subject = new Subject();
            }
            Console.WriteLine("Subject active");
            return "Proxy:Call to " + subject.Request();
        }
    }

    public class ProtectionProxy : ISubject
    {
        //认证代理首先要求一个密码             
        Subject subject; 
        String password = "Password01";

        public String Authenticate(String supplied)
        {
            if (supplied != password)
            {
                return "Protection Proxy: No access";
            }
            else
            {
                subject = new Subject();
                return "Protection Proxy : Authenticated";
            }
        }

        public String Request()
        {
            if (subject == null)
            {
                return "Protection Proxy : Authenticate first";
            }
            else 
                return "Protection Proxy: Call to " + subject.Request();
        }
    }



    class Client
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Proxy Pattern");
            Proxy p1 = new Proxy();
            Console.WriteLine(p1.Request());
            Console.WriteLine(p1.Request());

            Console.WriteLine("ProtectionProxy Pattern");
            ProtectionProxy p2 = new ProtectionProxy();
            Console.WriteLine(p2.Request());
            Console.WriteLine(p2.Authenticate("pass"));
            Console.WriteLine(p2.Request());
            Console.WriteLine(p2.Authenticate("Password01"));
            Console.WriteLine(p2.Request());
        }
    }
}

运行结果:



五 使用proxy的情景

1. 创建的代价比较高 
2. 需要访问控制 
3. 访问远程站点 
4. 被访问时需要执行一些动作 
你希望: 
1. 仅在操作被请求时创建对象 
2. 在对象被访问时检查或薄记工作 
3. 拥有一个可以引用远程对象的本地对象 
4. 在操作被请求时实施对象的访问权限验证 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值