Decorator模式:简单来讲,就是通过一个Decorator对原有对象进行封装,同事实现与原有对象相同的接口,从而得到一个基于原有对象的,对既有接口的增强型实现。
首先引入一个ConnectionDecorator类:
public class ConnectionDecorator implements Connection{
Connection dbconn;
public ConnectionDecorator(Connnection conn){
this.dbconn = conn;//实际从数据库获得的Connection引用
}
public void close()throws SQLException{
this.dbconn.close();
}
public void commit()throws SQLException{
this.dbconn.commit();//调用实际连接的commit方法
}
}
ConnectionDecorator类实际上是对传入的数据库连接加上了一个外壳,它实现了java.sql.Connection接口,不过本身并没有实现任何实际内容,只是简单的把方法的实现委托给运行期实际获得的Connection实例,而从外部看,ConnectionDecorator与普通的Connection实例没有什么区别。
public class PooledConnection extends ConnectionDecorator implements Connection{
private ConnectionPool connPool;
public PooledConnection(ConnectionPool pool,Connection conn){
super(conn);
connPool = pool;
}
//覆盖close方法,将数据库连接返回连接池中,而不是直接关闭连接
public void close()throws SQLException{
connPool.releaseConnection(this.dbconn);
}
}
动态代理:
public class ConnectionHandler implements InvocationHandler{
Connection dbconn;
ConnectionPool pool;
public ConnectionHandler(ConnectionPool connPool){
this.pool = connPool;
}
//将动态代理绑定到指定Connection
public Connection bind(Connection conn){
this.dbconn = conn;
Connection proxyConn = (Connection)Proxy.newProxyInstance(conn.getClass().getClassLoader(),conn.getClass().getInterfaces(),this);
return proxyConn;
}
//方法调用拦截器
public Object invoke(Object proxy,Method method,Object[] args)throws Throwable{
Object obj =null;
if("close".equals(method.getName())){
pool.releaseConnection(dbconn);
}else{
obj = method.invoke(dbconn,args);
}
return obj;
}
}
ConnectionHandler connHandler = new ConnectionHandler(this);
return connHandler.bind(conn);
可以看到,基于Dynamic Proxy模式的实现相对Decorator更加简洁明了。
posted on 2009-10-08 10:02
王永庆 阅读(197)
评论(0) 编辑 收藏 所属分类:
HIBERNATE