为另一个对象提供一个替身或占位符以控制对这个对象的访问。

代理模式的组成:

主题接口(Subject):提取真正主题与代理的公共方法,让使用真正主题的地方也能用代理代替。

真正主题(RealSubject):真正处理请求的类。

代理(Proxy):真正主题的代理类,请求方通过调用代理对象间接调用真正主题。设计模式----代理模式(Proxy)_编程

代理模式的简单例子:

(主题接口类)Subject.Java

 

[java]  view plain  copy
 
  1. package xu.neng.Proxy;  
  2.   
  3. public interface Subject {  
  4.     public void request();  
  5. }  

(正真主题类)RealSubject.java

 

[java]  view plain  copy
 
  1. package xu.neng.Proxy;  
  2.   
  3. public class RealSubject implements Subject{  
  4.     @Override  
  5.     public void request() {  
  6.         System.out.println("竟敢调用我!!!");  
  7.     }  
  8. }  

(代理类)Proxy.java

 

[java]  view plain  copy
 
  1. package xu.neng.Proxy;  
  2.   
  3. //必须和被代理对象继承统一接口  
  4. public class Proxy implements Subject {  
  5.     RealSubject realSubject;  
  6.   
  7.     public Proxy() {  
  8.         this.realSubject = new RealSubject();  
  9.     }  
  10.   
  11.     // 从构造方法中传入被代理的对象  
  12.     public Proxy(RealSubject realSubject) {  
  13.         this.realSubject = realSubject;  
  14.     }  
  15.   
  16.     // 调用方法  
  17.     @Override  
  18.     public void request() {  
  19.         realSubject.request();  
  20.     }  
  21. }  

(测试类,即Client)Test.java

 

[java]  view plain  copy
 
  1. package xu.neng.Proxy;  
  2.   
  3. /** 
  4.  * 测试代理模式。(相当于UML图中的Client) 
  5.  *  
  6.  * @author neng 
  7.  *  
  8.  */  
  9. public class Test {  
  10.     public static void main(String[] args) {  
  11.         // 我想调用RealSubject出来玩玩  
  12.         Proxy proxy = new Proxy(new RealSubject());  
  13.         proxy.request();  
  14.     }  
  15. }  


 

代理模式的应用:

 

iOS开发中常用。代理模式更像是一种思想,通过中间手段来控制正真对象的访问,同时还可以做一些包装。

防火墙代理:控制网络资源的访问、保护主题免于坏客户的侵害。
智能引用代理:当主题被引用时,可以进行额外的动作。如进行引用计数等。
缓存代理:为开销大的运算结果提供临时存储。允许多个客户共享结果,以减少计算或网络延迟。(本质上还是额外做其他事情)
同步代理:多线程时,为主题提供安全的访问。
写入时复制代理:用来控制(延迟)对象的复制,直到客户真的需要为止。