无废话C#设计模式之九:Proxy

转载 2011年01月18日 13:50:00

无废话C#设计模式之九:Proxy

 

意图

 

       为其他对象提供一种代理以控制对这个对象的访问。

 

场景

 

代理模式非常常用,大致的思想就是通过为对象加一个代理来降低对象的使用复杂度、或是提升对象使用的友好度、或是提高对象使用的效率。在现实生活中也有很多代理的角色,比如明星的经纪人,他就是一种代理,经纪人为明星处理很多对外的事情,目的是为了节省被代理对象也就是明星的时间。保险代理人帮助投保人办理保险,目的降低投保的复杂度。

在开发中代理模式也因为目的不同效果各不相同。比如,如果我们的网站程序是通过.NET Remoting来访问帐号服务的。在编写代码的时候可能希望直接引用帐号服务的DLL,直接实例化帐号服务的类型以方便调试。那么,我们可以引入Proxy模式,做一个帐号服务的代理,网站只需要直接调用代理即可。在代理内部实现正式和测试环境的切换,以及封装调用.NET Remoting的工作。

 

示例代码

 

using System;

using System.Collections.Generic;

using System.Text;

 

namespace ProxyExample

{

    class Program

    {

        static void Main(string[] args)

        {

            AccountProxy ap = new AccountProxy();

            ap.Register();

        }

    }

 

    interface IAccount

    {

        void Register();

    }

 

    class Account : IAccount

    {

        public void Register()

        {

            System.Threading.Thread.Sleep(1000);

            Console.WriteLine("Done");

        }

    }

 

    class AccountProxy : IAccount

    {

        readonly bool isDebug = true;

        IAccount account;

        public AccountProxy()

        {

            if (isDebug)

                account = new Account();

            else

                account = (IAccount)Activator.GetObject(typeof(IAccount), "uri");

        }

        public void Register()

        {

            Console.WriteLine("Please wait...");

            account.Register();

        }

    }

}

代码执行结果如下图:

 

 

代码说明

 

l         IAccount就是抽象主题角色。代理对象和被代理对象都遵循这个接口,这样代理对象就能替换被代理对象。

l         AccountProxy就是代理主题角色。代理主题通常会存在一些逻辑或预处理或后处理操作,不会仅仅是对操作的转发。

l         Account就是真实主题角色。

 

何时采用

 

l         代理模式应用非常广泛,如果你希望降低对象的使用复杂度、或是提升对象使用的友好度、或是提高对象使用的效率都可以考虑代理模式。

 

实现要点

 

l         代理对象和被代理对象都遵循一致的接口。

l         在某些情况下,可以不必保持接口一致性,如果封装确实需要损失一些透明度,那么也可以认为是Proxy

 

注意事项

 

l         ProxyFacade以及Adapter可能都是对对象的一层封装,侧重点不同。Proxy基于一致的接口进行封装,Facade针对封装子系统,转化为高层接口,而Adapter的封装是处于适配接口的目的。

无废话C#设计模式之九:Proxy

 意图        为其他对象提供一种代理以控制对这个对象的访问。 场景 代理模式非常常用,大致的思想就是通过为对象加一个代理来降低对象的使用复杂度、或是提升对象使用的友好度、或是提高对象使用的效率...
  • xjj51296646
  • xjj51296646
  • 2009年01月05日 12:07
  • 391

无废话MVC系列教程

http://www.cnblogs.com/iamlilinfeng/category/454097.html MVC入门教程 摘要: 一、前言以下是我自己写的MVC入门教程和一个外...
  • SalmonellaVaccine
  • SalmonellaVaccine
  • 2014年05月24日 02:24
  • 1161

随笔分类 - 无废话ExtJs系列教程

随笔分类 - 无废话ExtJs系列教程 http://www.cnblogs.com/iamlilinfeng/archive/2012/07/10/2585232.html ExtJs ...
  • zdy0_2004
  • zdy0_2004
  • 2015年10月03日 15:25
  • 576

无废话C#设计模式之十二:Composite

 意图        将对象组合成树形结构以表示“部分-整体”的层次结构。Composite模式使得用户对单个对象和组合对象的使用具有一致性。 场景 我们知道,一个网络游戏通常会有多个游戏大区。每一个...
  • xjj51296646
  • xjj51296646
  • 2009年01月05日 12:09
  • 390

无废话C#设计模式之六:Builder

 意图        将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。 场景        在电脑城装机总有这样的经历。我们到了店里,先会有一个销售人员来询问你希望装的机器是怎么...
  • xjj51296646
  • xjj51296646
  • 2009年01月05日 12:05
  • 498

无废话C#设计模式之十一:Composite

无废话C#设计模式之十一:Composite 意图        将对象组合成树形结构以表示“部分-整体”的层次结构。Composite模式使得用户对单个对象和组合对象的使用具有一致性。 场景 我们知...
  • rise51
  • rise51
  • 2011年01月18日 14:27
  • 212

无废话C#设计模式之十:Flyweight

 意图        运用共享技术有效地支持大量细粒度的对象。 场景 在比较底层的系统或者框架级的软件系统中,通常存在大量细粒度的对象。即使细力度的对象,如果使用的数量级很高的话会占用很多资源。比如,...
  • xjj51296646
  • xjj51296646
  • 2009年01月05日 12:08
  • 418

无废话XML--XML细节

今天开始研究xml,其实在实际的开发中,我们参与到真正的XML开发并不是很多,最多写一个配置,但是我还是觉得很有必要把XML的知识整理一遍。作为基本的2种的数据交互载体(还有一个是json),基本的X...
  • u011794238
  • u011794238
  • 2014年12月22日 15:38
  • 728

无废话C#设计模式之十八:Command

无废话C#设计模式之十八:Command意图将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。场景我们知道,网络游戏中的客户端需要不断把...
  • crg818
  • crg818
  • 2007年11月16日 18:27
  • 196

无废话C#设计模式之十四:Strategy

 意图        定义一系列的算法,把它们一个一个封装起来,并且使它们可相互替换。本模式使得算法可以独立于它的客户而变化。 场景        在开发程序的时候,我们经常会根据环境不同采取不同的算...
  • xjj51296646
  • xjj51296646
  • 2009年01月05日 12:14
  • 516
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:无废话C#设计模式之九:Proxy
举报原因:
原因补充:

(最多只允许输入30个字)