无废话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#设计模式之一:开篇

无废话C#设计模式之一:开篇 什么是设计模式?        什么是少林拳呢?少林拳是少林僧人经过长期的总结,得出的一套武功套路。有一本叫做少林拳法的武功秘籍,上面记载这这套拳法的适用人群,打法套路和...
  • rise51
  • rise51
  • 2011年01月17日 15:02
  • 402

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

无废话C#设计模式之十五:Strategy 意图        定义一系列的算法,把它们一个一个封装起来,并且使它们可相互替换。本模式使得算法可以独立于它的客户而变化。 场景        在开发程序...
  • rise51
  • rise51
  • 2011年01月18日 16:05
  • 212

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

无废话C#设计模式之十四:Template Method 意图        定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重...
  • rise51
  • rise51
  • 2011年01月18日 15:57
  • 177

无废话C#设计模式之四:Factory Method

无废话C#设计模式之四:Factory Method 意图        定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。 场景        上次,我们使用抽象工厂解决了生产一组产品的问...
  • rise51
  • rise51
  • 2011年01月18日 10:48
  • 225

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

无废话C#设计模式之十八:Command 意图        将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。 场景        我...
  • rise51
  • rise51
  • 2011年01月18日 17:03
  • 262

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

无废话C#设计模式之十二:Bridge 意图        将抽象部分与实现部分分离,使它们都可以独立的变化。 场景 还是说我们要做的网络游戏,多个场景需要扩充的问题我们已经采用了创建型模式来解决。现...
  • rise51
  • rise51
  • 2011年01月18日 15:44
  • 179

无废话C#设计模式之五:Prototype

无废话C#设计模式之五:Prototype 意图        用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 场景        游戏场景中的有很多相似的敌人,它们的技能都一样,但...
  • rise51
  • rise51
  • 2011年01月18日 11:08
  • 203

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

无废话C#设计模式之二:Singleton 意图        保证一个类只有一个实例,并提供访问它的全局访问点。 场景        我们现在要做一个网络游戏的服务端程序,需要考虑怎么样才能承载大量...
  • rise51
  • rise51
  • 2011年01月17日 15:03
  • 186

无废话C#设计模式之二十二:总结(针对GOF23)

无废话C#设计模式之二十二:总结(针对GOF23) 比较 设计模式常用程度适用层次引入时机结构复杂度Abstract Factory比较常用应用级设计时比较复杂Builder一般代码级编码时一般Fac...
  • rise51
  • rise51
  • 2011年01月18日 17:23
  • 275

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

无废话C#设计模式之十六:State 意图        允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。 场景        我们在制作一个网上书店的网站,用户在书店买了一定...
  • rise51
  • rise51
  • 2011年01月18日 16:18
  • 297
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:无废话C#设计模式之九:Proxy
举报原因:
原因补充:

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