代理模式( Proxy ): 为其他对象提供一种代理以控制对这个对象的访问。

使用场景:(选自《设计模式迷你手册》—— RedSword软件工作室

1、 远程代理(Remote Proxy  为一个对象在不同的地址空间提供局部代

2、 虚代理(Virtual Proxy  根据需要创建开销很大的对象。

3、 保护代理(Protection Proxy  控制对原始对象的访问。保护代理用于对象应该有不同的访问权限的时候。

4、 智能指引(Smart Reference  取代了简单的指针,它在访问对象时执行一些附加操作。

上面的远程代理( Remote Proxy )可以在这篇文章( http://haolloyin.blog.51cto.com/1177454/332426 )了解到关于 Java RMI框架的应用实现。同时我个人认为上面的虚代理可以运用到单例模式(可了解文章 http://haolloyin.blog.51cto.com/1177454/332469 )、线程池等相关实现技术,因为它们或多或少有相关联的目的性或者实现手段。

至于保护代理和智能代理,名称看起来似乎很高级,但是却不难理解,前者是限制访问某一对象或者服务的权限,后者是在原有的基本服务服务上进行加工处理,使其符合标准、满足要求。例如,对一些请求消息进行重新编组再发送出去,这在上面给出的Java RMI框架中有这个例子。
通用类图:

类图还算简单,具体实现代码如下:

测试结果:

第一种代理:代理者认识被代理者

代理者的 request() ...

被代理者的 request() ...

被代理者操作完成 ...

第二种代理:代理者不认识被代理者

代理者的 request() ...

被代理者的 request() ...

被代理者操作完成 ...

      另外还有一种强制代理,即必须通过被代理者自身来指定自己被谁代理,此时这个被代理者自身必须拥有一个返回自己的代理的方法,那么就需要修改一下几个类的相关方面了。 具体代码实现如下:
//抽象主题增加了可以返回自身代理对象的方法getProxy() 
abstract  class Subject02 { 
   public  abstract  void request(); 
   public  abstract Subject02 getProxy(); 


//被代理者 
class RealSubject02  extends Subject02 { 
   private Subject02 proxy =  null

   //被代理者明白自己需要被代理,于是将自己this作为参数找到自己的代理 
   public RealSubject02() { 
     this.proxy =  new Proxy03( this); 
  } 

   public  void request() { 
    System.out.println( "被代理者的 request() ..."); 
  } 

   public Subject02 getProxy() { 
     return  this.proxy; 
  } 


//代理者,它是由具体的被代理者指定的 
class Proxy03  extends Subject02 { 
   private Subject02 realSubject =  null

   public Proxy03(Subject02 realSubject) { 
     this.realSubject = realSubject; 
  } 

   public  void request() { 
    System.out.println( "代理者的 request() ..."); 
     this.realSubject.request(); 
    System.out.println( "被代理者操作完成 ..."); 
  } 
    
   //代理者本身只是返回自己,当然也可以一直扩展下去 
   public Subject02 getProxy() { 
     return  this
  } 


public  class Client { 
   public  static  void main(String[] args) { 
    System.out.println( "\n第三种代理:强制代理"); 
    Subject02 realSubject =  new RealSubject02(); 
     //获得具体被代理者的代理 
    Subject02 proxy03 = realSubject.getProxy(); 
    proxy03.request(); 
  } 
}
测试结果:

第三种代理:强制代理

代理者的 request() ...

被代理者的 request() ...

被代理者操作完成 ...

实际上,强制代理方式中的被代理者类中可以添加一些方法来判断自己的代理是否已经存在,再根据存在与否来决定被代理者确实能够对外提供的服务,或者做出非法访问警告,或者直接由“被代理者”(其实这个时候都存在代理者了,也就谈不到被代理者自身了)自己实现。

代理模式是我们现实生活中比较常见的,虽然有多种形式的代理,但是一结合现实生活中的具体事例理解一下应该很容易明白的。

      最后说明一下,文章前面给出的通用类图中有其他几个方法,这用到了观察者(Observer)模式了,具体的在后面的文章再实现出来吧。
//抽象主题,定义一系列业务需求处理 
abstract  class Subject{ 
   public  abstract  void request(); 


//真实主题,即被代理者 
class RealSubject01  extends Subject{ 
   public  void request() { 
    System.out.println( "被代理者的 request() ..."); 
  } 


//代理者 
class Proxy01  extends Subject{ 
   private Subject subject =  null
    
   //传进被代理者的方式使得代理者了解自己代理了谁 
   public Proxy01(Subject realSubject) { 
     this.subject = realSubject; 
  } 
    
   public  void request() { 
    System.out.println( "代理者的 request() ..."); 
     this.subject.request(); 
    System.out.println( "被代理者操作完成 ..."); 
  } 


class Proxy02  extends Subject{ 
   private Subject subject =  null
    
   //直接new 一个被代理者,代理者事先不必知道自己代理了谁,只管负责做好本职工作 
   public Proxy02() { 
     this.subject =  new RealSubject01(); 
  } 
    
   public  void request() { 
    System.out.println( "代理者的 request() ..."); 
     this.subject.request(); 
    System.out.println( "被代理者操作完成 ..."); 
  } 


public  class Client { 
   public  static  void main(String[] args) { 
    System.out.println( "第一种代理:代理者认识被代理者"); 
    Subject proxy01 =  new Proxy01( new RealSubject01()); 
    proxy01.request(); 
     
    System.out.println( "\n第二种代理:代理者不认识被代理者"); 
    Subject proxy02 =  new Proxy02(); 
    proxy02.request(); 
  } 
}