如何回答什么是代理模式?
在代理模式(Proxy Pattern)中,我们创建具有现有对象的对象,以便向外界提供功能接口。那什么是代理呢?假设我们想请明星来学校唱歌,我们不可能联系明星本人,他太忙了,我们会联系他的经纪人,然后明星来唱歌。这其中经纪人就是代理。
为什么要使用代理模式?优缺点?使用场景?
使用目的:解决在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。
优点:(1)职责清晰(2)高扩展性(3)智能化。
缺点:(1)由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。(2)实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
使用场景:(1)最为出名的就是spring aop(2)Windows 里面的快捷方式
如何手撕代理模式
我们将创建一个 Image 接口和实现了 Image 接口的实体类。ProxyImage 是一个代理类,减少 RealImage 对象加载的内存占用。
ProxyPatternDemo,我们的演示类使用 ProxyImage 来获取要加载的 Image 对象,并按照需求进行显示。

步骤 1
创建一个接口。
Image.java
public interface Image { void display(); }
步骤 2
创建实现接口的实体类。
RealImage.java
public class RealImage implements Image { private String fileName; public RealImage(String fileName){ this.fileName = fileName; loadFromDisk(fileName); } @Override public void display() { System.out.println("Displaying " + fileName); } private void loadFromDisk(String fileName){ System.out.println("Loading " + fileName); } }
ProxyImage.java
public class ProxyImage implements Image{ private RealImage realImage; private String fileName; public ProxyImage(String fileName){ this.fileName = fileName; } @Override public void display() { if(realImage == null){ realImage = new RealImage(fileName); } realImage.display(); } }
步骤 3
当被请求时,使用 ProxyImage 来获取 RealImage 类的对象。
ProxyPatternDemo.java
public class ProxyPatternDemo { public static void main(String[] args) { Image image = new ProxyImage("test_10mb.jpg"); //图像将从磁盘加载 image.display(); System.out.println(""); //图像将无法从磁盘加载 image.display(); } }
步骤 4
验证输出。
Loading test_10mb.jpg Displaying test_10mb.jpg Displaying test_10mb.jpg
具体内容来源于:http://www.runoob.com/design-pattern/proxy-pattern.html