我读设计模式之代理模式(Proxy Pattern)

     一直在使用web service,偶尔也会用到.net Remoting,但是直到学习了代理模式,才发现原来他们都采用的这种技术。
 

     引入     代理模式的使用非常广泛。开发过程中,有些对象是部署在网络中另外一台server上,比如web service。如果在客户端直接进行对象访问,会增加client操作的复杂度(处理网络通信的问题等)。这个时候,应用代理模式,在客户端建立远端对象的代理对象,让代理对象处理复杂的逻辑,而客户端只简单的调用此代理对象即可。

     实际上,web service的使用就是这样:我们在客户端添加完对web service的引用后,就在本地生成了web service的代理,之后所有的操作,实际上就是对代理对象的操作。

     

     例证(模拟web service服务)
     1.UML
          

     

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

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

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

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

 

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

namespace Demo1
{
    
class Program
    
{
        
static void Main(string[] args)
        
{
            Proxy dal 
= new Proxy();  //客户端直接调用代理对象
            dal.ExecuteInsert();
            dal.GetString(
"I001");
        }

    }


    
interface IDAL //声明统一的接口
    {
        
void ExecuteInsert();
        
string GetString(string id);
    }

    
class Proxy : IDAL     //代理对象实现
    {
        DAL cDal;
        
public Proxy()
        
{
            cDal 
= new DAL();
        }

        
public void ExecuteInsert()
        
{
            cDal.ExecuteInsert();
        }

        
public string GetString(string id)
        
{
           
return cDal.GetString(id);
        }

    }

    
class DAL : IDAL        //具体对象实现
    {
        
public void ExecuteInsert()
        
{
            Console.WriteLine(
"Insert a value to Database");
        }

        
public string GetString(string id)
        
{
            Console.WriteLine(
"get string from database by "+id);
            
return null;
        }

    }

}

     
    说明  
     1). 范例中代理类的实现只是对具体类的转发。但是实际应用中通常会在实际请求前后添加预请求和请求后的处理。

     2).代理模式实现的要点很明确:代理类和被代理类要有统一的接口,这样才会有统一的实现,保证了代理的功能实现。

     3).如果你希望降低对象的使用复杂度、或是提升对象使用的友好度、或是提高对象使用的效率都可以考虑代理模式。


     总结         

  在软件系统中,增加一个中间层是我们解决问题的常见手法,这方面Proxy模式给了我们很好的实现。代理模式其实就是在访问对象的时候引入一定程度的间接性,因为这种间接性,我们可以附加更多的用途和控制。
     

 

     学习参考:
     http://www.cnblogs.com/Terrylee/archive/2006/05/18/403382.html

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

     http://www.cnblogs.com/lovecherry/archive/2007/10/08/917363.html

     大话设计模式:代理模式

posted on 2008-07-25 09:59  easy2Dev  阅读(360)  评论(1编辑  收藏  举报

导航