基本定义
为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理模式可以在客户端和目标对象之间起到中介作用。
何种情况使用?
(1)远程代理,也就是为一个对象在不同地址空间提供局部代表。这样可以隐藏一个对象在不同地址看空间的事实。【DP】。
(2)虚拟代理,根据需要创建很大的对象。通过它来存放实例化需要很长时间的真实对象。【DP】
(3)安全代理,用来控制真是对象访问时的权限。【DP】
(4)智能指引,是指当调用真实对象时,代理处理另外一些事。【DP】
UML图
代码
静态proxy
package com.bjsxt.proxy;
public class Agent {
public static void main(String[] args) {
Proxy proxy = new Proxy();
proxy.request();
}
}
package com.bjsxt.proxy;
abstract class Subject {
public abstract void request();
}
package com.bjsxt.proxy;
public class RealSubject extends Subject {
public void request() {
System.out.println("真实请求");
}
}
package com.bjsxt.proxy;
public class Proxy extends Subject {
RealSubject realSubject = null;
public void request() {
if(realSubject == null){
realSubject = new RealSubject();
}
realSubject.request();
}
}
动态proxy
package com.bjsxt.dyproxy;
import java.lang.reflect.Proxy;
public class Agent {
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
ProxyTo proxyTo = new ProxyTo(realSubject);
Subject proxy = (Subject)Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Subject.class}, proxyTo);
proxy.request();
}
}
package com.bjsxt.dyproxy;
interface Subject {
public abstract void request();
}
package com.bjsxt.dyproxy;
public class RealSubject implements Subject {
public void request() {
System.out.println("真实请求");
}
}
package com.bjsxt.dyproxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class ProxyTo implements InvocationHandler {
RealSubject realSubject = null;
public ProxyTo(RealSubject realSubject) {
this.realSubject = realSubject;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object object = null;
System.out.println("真正执行");
if(method.getName().equals("request")){
object = method.invoke(realSubject, args);
}
return object;
}
}