什么是代理模式从代理这两个字就大概可以猜到这个模式应该是做什么用的。代理模式是为被访问的对象提供一个代理,这样的话,对象的访问者访问就是这个代理对象。下面的UML图可以比较清晰的表示这样的关系。

编辑
(图片来源,wikipedia)
从图中可以看出,Proxy类和RealSubject类都实现了接口Subject。RealSubject.DoAction()方法才是访问者真正要调用的方法,Proxy代理类中,同样有一个方法DoAction()。这样的话,访问者可以访问这个代理类的方法,而不用调用RealSubject的。RealSubject就这样被完全屏蔽起来了。实际上,在代理类Proxy的DoAction方法中,具体的功能实现还是调用了RealSubject的DoAction方法,看似这样的话,感觉就很没有必要了。并不是的,代理模式的存在也是相当有必要的。
代理模式存在的作用
在UML图中我们看到的Subject接口只有一个方法,如果很多个方法, RealSubject中必须要实现所有的方法,每个方法的实现逻辑可能都很复杂,如果直接使用RealSubject则需要加载所有的方法的实现供给访问者使用,而往往访问者需要使用的只有那么几个方法,直接提供RealSubject是很没有必要的。代理模式提供了这样一种简洁的代理类,Proxy中不需要完成所有代码的实现,只需要实现那些需要用到的方法(方法中具体实现为空,所有的方法还是要Override的)。
还有一个比较好的作用是,若我们实例化对象RealSubject的时候,每次是实例化都要暂用内存的,实例化后可能并非所有的都用了。但是若使用Proxy的话,在实例化Proxy的时候,不会去直接实例化RealSubject类,且Proxy类要比RealSubject小很多,不需要暂用多少的内存。这样只有在具体要调用时候,才会去实例话RealSubject类,因为Proxy方法中的实现还是调用RealSubject的。
请看下面的代码。代码源自wikipedia.
上面的例子代码中就可以清晰的看到代理的作用是比较明显的。系统中往往具体的实现类是非常大的,尤其在企业级的系统中,代理模式中的代理类可以很好的减少实现类的实例化次数。代理类的实例化并不是很关键,因为代理类只是调用具体的实现类中的方法,占用的内存要小的很多。