Dynamic Proxy
是
JDK 1.3
版本中新引入的一种代理机制。严格来讲,
Dynamic Proxy
本身并非一种模式,只能算是
Proxy
模式的一种动态实现方式,不过为了与传统
Proxy
模式相区分,这里暂且将其称为“
Dynamic Proxy
模式”来泛指通过
Dynamic Proxy
机制实现的
Proxy
模式。
通过Decorator模式,我们可以改写接口的功能,但由于Decorator 模式要求实现与目标对象一致的接口,Connection接口中定义的方法众多,我们也只能照单全收,在ConnectionDecorator中逐一实现这些方法,虽然只是简单的委托实现,也实在是件恼人的工作。Dynamic Proxy 模式则良好的解决了这一问题。通过实现一个绑定到Connection对象的InvocationHandler接口实现,我们可以在onnection.close方法被调用时将其截获,并以我们自己实现的close方法将其替代。代码举例如下:
下面是ConnectionHandler 类,它实现了InvocationHandler接口,按照Dynamic Proxy
机制的定义,invoke方法将截获所有代理对象的方法调用操作,这里我们通过invoke方法
截获close方法并进行处理。
public class ConnectionHandler implements InvocationHandler {
public class ConnectionHandler implements InvocationHandler {
private Connection dbconn;
/**
* 将动态代理绑定到指定Connection
* @param conn
* @return 绑定代理后的Connection
*/
public Connection bind(Connection conn) {
this.dbconn = conn;
Connection proxyConn = (Connection) Proxy.newProxyInstance(
conn.getClass().getClassLoader(), conn.getClass().getInterfaces(), this);
return proxyConn;
}
/*
* 方法调用拦截器
* 判断当前调用的方法是否"close"方法,如是,可以改写该方法。
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{
Object obj =null;
//如果调用的是close方法,则用
Object obj =null;
//如果调用的是close方法,则用pool.releaseConnection方法将其替换
if ("close".equals(method.getName())) {
//实现自己的方法……
} else {
obj = method.invoke(dbconn, args);
}
return obj;
}
//如果调用的是close方法,则用pool.releaseConnection方法将其替换
if ("close".equals(method.getName())) {
//实现自己的方法……
} else {
obj = method.invoke(dbconn, args);
}
return obj;
}
}
使用:
public Connection getConnection() {
ConnectionHandler connHandler = new ConnectionHandler();
return connHandler.bind(conn);
return connHandler.bind(conn);
}