一、定义

为其他对象提供一个代理以控制对这个对象的访问。

二、类图表示

代理模式

三、实现

1、Subject与RealSubject

package pattern.structual.proxy;

public interface Subject {

	public void request();
}


package pattern.structual.proxy;

public class RealSubject implements Subject{

	@Override
	public void request() {
		System.out.println("RealSubject request()...");
	}

}

2、Proxy

package pattern.structual.proxy;

public class Proxy implements Subject {

	private RealSubject realSubject;
	
	@Override
	public void request() {
		if(realSubject == null){
			realSubject = new RealSubject();
		}
		realSubject.request();
	}

}

四、使用

package pattern.structual.proxy;

public class Client {

	public static void main(String[] args) {
		Subject proxy = new Proxy();
		proxy.request();
	}
}

  • 程序输出:

RealSubject request()...

五、适用场合

1、虚拟和远程代理

当客户端不能直接操作到某个对象,但又必须和那个对象互动。

  • 虚拟代理(Virtual Proxy):如果那个对象的创建开销很大时(例如:文档中有个很大的图片,而文档需要快速打开,此时该图片需要用Proxy来代替真正的图片)

  • 远程代理(Remote Proxy):如果那个对象在Internet的某个远程服务器上,直接操作该对象会因为网络原因速度慢,此时可以先用Proxy对象来代替

2、授权机制

不同身份的用户对同一对象拥有不同的访问权利

  • 保护代理(Protection Proxy):根据不同的访问权限控制对原始对象的访问