设计模式初探(八)之Proxy代理
基本上代理做的事情就是被代理能做的所有事情,或者做的更多,你会去在代理类中声明一个被代理类的变量,然后将调用的信息传递给它,事实上是通过它去执行操作的。代理是一个很不错的模式,我更想叫他们公式,数学中是这样的,我喜欢数学。在结构型模式中,adpter,decorator,composite,都是这样的,通过封装一个需要实际履行职能的接口的变量,然后对其进行不同目的的修饰和解释,GOF的书中关于结构模式额度总结我看到很多“aim to”之类的,或者说看待它们的角度不一样:
?
import java.lang.reflect.*;interface ProxyInterface{ public void doSomeThing();}public class ProxyTest{ public static void main(String args[]){ ProxyInterface proxy = (ProxyInterface) Proxy.newProxyInstance( ProxyInterface.class.getClassLoader(),new Class[]{ProxyInterface.class},new InvocationHandler(){ public Object invoke(Object proxy,Method method,Object[] args){ int count = 0; System.out.println("doSomeThing! "+(++count)+" time"); return null; } }); for(int i=0;i<10;++) proxy.doSomeThing(); }
?我喜欢这段代码,动态的给某接口的方法创建一个代理,而不是在客户端中更改其调用的具体代码,并且可以实现计数!
java的动态代理类做的事情太丰富了,不管是查看数据库的查询的次数(我想这对于调试数据库性能很重要),还是对其进行事务管理,并且动态代理可以进行丰富的功能扩展。。。用代理进行调用计数貌似叫smart proxy,我想在spring中关于proxy的运用应该很多的吧。
代理在aop中的运用是很多的,因为你可能会选取到你想要进行额外操作的切面,那么用Proxy就很容易实现了:
class SessionImpl implements Session{ public void save(){ System.out.println("save object"); }class SessionProxy implements Session{ Session session = new Session(); public void save(){ doTransactionBefore(); session.save(); doTransactionAfter(); }}public class AspectProy{ public static Session getSession(){ return new SessionProxy(); }}?
代码,你们懂的。。