善用设计模式(二)代理模式

使用代理模式的意图有很多,比如因为安全问题,需要屏蔽客户端直接访问真实对象;或者在远程调用中,需要使用代理类处理远程方法调用的技术细节(如RMI);也可能是为了提升系统性能,对真实的对象进行封装,从而达到延迟加载的目的。
在此主要讨论使用代理模式实现延迟加载,从而提升系统的性能和反应速度。
在系统启动时,将消耗资源多的方法使用代理模式分离,就可以加快系统的启动速度,减少用户的等待时间。在用户真正做操作的时候,再由代理类单独去加载真实的操作类,完成操作。这个过程就实现了延迟加载。
普通方式构造会比较慢

public class DBQuery {
    public DBQuery(){
        try{
            Thread.slleep(1000);//可能包含耗时操作
        }catch(InterruptedException e){
            e.printStackTrace(e);
        }
        public String rquest(){
            return "request string";
        }
    }
}

代理类是轻量对象,创建很快

public class DBQueryProxy{
    private DBQuery real = null;
    public String request(){
        //在真正需要时才创建对象,创建过程可能很慢
        if(real==null){
            real = new DBQuery();
        }
        return real.request();
    }
}

代理模式中还有一种动态代理
动态代理指在运行时,动态生成代理类。代理类的字节码将在运行时生成并载入当前的ClassLoder。与静态代理相比有很多好处,首先,不需要为真实的主题写一个形式上完全一样的类,去除了不便于维护的缺点。其次,使用动态代理生成方法可以在运行时执行代理类的执行逻辑从而提高系统灵活性。
生成代理类可以使用:JDK代理,CGLIB代理,Javaassist代理,或者ASM库。JDK代理比较简单,但是CGLIB代理和Javaassist代理总体的性能会比JDK代理的性能要好。ASM的性能最好,但是它是低级的字节码生成工具,使用过于繁琐,所以除对性能有苛刻要求的场合外,推介使用CGLIB代理和Javaassist代理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章