释义
代理模式,又称委托模式;
为其他对象提供一种代理以控制对该对象的访问
使用场景
当无法或不想直接访问某个对象或访问困难时,通过代理对象间接访问
前提
代理对象和被代理对象需要实现相同的接口
或者抽象类
静态代理
事先通过代码编写,已经预先知道所需要代理的对象
实现代码
/** 抽象类 */
public interface ProxyInterface {
// 抽象方法
void testProxy();
}
/** 真实对象 */
public class RealObject implements ProxyInterface{
@override
public void testProxy(){
}
}
/** 代理类 */
public class ProxyObject implements ProxyInterface{
private ProxyInterface realObject;
public ProxyObject(ProxyInterface realObject) {
this.realObject = realObject;
}
@override
public void testProxy(){
realObject.testProxy();
}
}
- 代理类持有真实对象的引用
- 代理的实际调用是真实对象在调用
// 构造真实对象
RealObject realObject = new RealObject();
// 使用真实对象构造代理对象
ProxyObject proxyObject = new ProxyObject(realObject);
// 代理对象执行操作
proxyObject.testProxy();
动态代理
通过反射机制
动态地生成代理对象,代理谁只有在代码执行的时候才知道;
java提供了一个类用于动态代理的处理 – InvocationHandler
,实现该接口需要重写其 invoke
方法
代码实现
// 生成真实对象
final RealObject realObject = new RealObject();
// 通过动态代理,根据真实对象生成代理对象
ProxyInterface proxyInstance = (ProxyInterface) Proxy.newProxyInstance(
realObject.getClass().getClassLoader(),
new Class[]{
ProxyInterface.class
},
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 执行 invoke 方法,代理执行的方法。
return method.invoke(realObject, args);
}
});
// 代理对象执行方法
proxyInstance.testProxy();
- 动态代理获得代理对象
- 代理对象执行方法时,通过 invoke() 方法执行真实对象的方法