用Java动态代理来创建包装器

ZDNet软件频道 时间:2003-07-11 作者:周靖 译 |  我要评论(1)
本文关键词:
如果你采用的是良好的、由接口驱动的设计方案,我个人觉得动态代理的用处肯定要比你想象的多,最终你会叹服于它从容解决许多问题的本事!
本文译自Builder.com,未经许可请勿转载Java 1.3引入了名为“动态代理类”(Dynamic Proxy Class)的新特性,利用它可为“已知接口的实现”动态地创建包装器(wrapper)类。1.3版本问世以前,当我首次听说当时正在提议的动态代理类时,还以为它只是一种用来吸引人的眼球的特性。虽然把它包括到语言中是一件好事,但我却想不出它有任何实际用处。带着这一成见,我试着用动态代理写了一个示例程序,却惊讶于它的巨大威力,并当即决定把它放到我的工具箱中,以便在将来的项目中使用。此后,我不断体验到它的好处,它总是能用正确的方法来做你想要做的事情!

假如没有动态代理

深入探索动态代理类之前,先来看看在某些情况下,假如没有动态代理类会是什么样子: 

public interface Robot {
    void moveTo(int x, int y);
    void workOn(Project p, Tool t);
}
 
public class MyRobot implements Robot {
    public void moveTo(int x, int y) {
        // stuff happens here
    }
    public void workOn(Project p, Tool t) {
        // optionally destructive stuff happens here
    }
}

上述代码展示了一个名为Robot的接口,以及该接口的一个名为MyRobot的大致的实现。假定你现在想拦截对MyRobot类发出的方法调用(可能是为了限制一个参数的值)。
 
public class BuilderRobot implements Robot {
    private Robot wrapped;
    public BuilderRobot(Robot r) {
        wrapped = r;
    }
    public void moveTo(int x, int y) {
        wrapped.moveTo(x, y);
    }
    public void workOn(Project p, Tool t) {
        if (t.isDestructive()) {
            t = Tool.RATCHET;
        }
        wrapped.workOn(p, t);
    }
}

 


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134