• 【设计模式 5】那些年我还不懂代理模式


    导读:话说,当年学习了大话设计模式,后来又学习了head first,脑袋里能画出UML图,能写出代码的,不多。以致于到前一段时间,我还不能背着写出很常用的单例模式的代码!但是,本宝宝从很久以前开始面试的时候,就敢往简历上写熟悉设计模式,比如:。。。。。。。。果然,我还是个宝宝!本篇博客主要是总结一下,我知识储备以外的关于代理模式的运用,主要是提升系统的反应效率!


    一、代理模式的设计意图

    (主要摘抄于大话设计模式,有熟悉的,见笑之余,请果断忽略)

    1.1,使用代理类处理远程方法调用的技术细节

    远程代理,也就是为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实

    1.2,延迟加载

    虚拟代理,是根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象

    1.3,屏蔽客户端直接访问真实对象

    安全代理,用来控制真实对象访问时的权限

    1.4,智能指引

    当调用真实的对象是,代理处理另外一些事(个人感觉,这个和处理远程方法调用的技术细节很近。不过,按照书上的例子,假如说要计算实际对象的引用次数,那么这个时候就用代理类)


    备注:当时看书的时候,对这几个用途没有很好地理解,后来学习了也使用了JDK和CGLib代理,稍微熟了点,然后补了一些理论知识,因为做项目的原因,结合到实践,才慢慢的有了些许的真正的熟悉,接下来主要介绍的是使用代理进行延迟加载!


    二、代码对比

    我先说一下,我当年为什么没懂代理:第一,实战经验不足;第二,理论不扎实;第三,这有点考我智商的代码

    2.1,我自己错误的写法

    public interface IDBQuery{
    	String Request();
    }
    
    public class DBQuery implements IDBQuery{
    	@Override
    	public String Request(){
    		return "request String"
    	}
    }
    
    public class DBQueryProxy implements IDBQuery{
    	private DBQuery real=null;
    	@Override
    	public String Request(){
    		real =new DBQuery();
    		return real.Request();
    	}
    }
    
    public class Main{
    	public static void main(String args[]){
    		IDBQuery q=new DBQueryProxy();
    		q.Request();
    	}
    }
    备注:我之前一直都不理解,这样多弄出一个类来,到底好在哪儿了,还不如直接调用真实的实现类,唉。。。。。。。。

    2.2,延迟加载的写法(只展示关键部分)

    public class DBQueryProxy implements IDBQuery{
    	private DBQuery real=null;
    	@Override
    	public String Request(){
    		if(real==null){
    			real =new DBQuery();
    		}
    		return real.Request();
    	}
    }
    我一直都忽略了或者没有重视这个real==null的判断,我也是够够的了。话说,加上这个判断,就能在真正用到的时候,才创建真实的对象,可以有效地提升系统的启动速度,对改善用户体验有很大的帮助

    三、总结

    1,首先,我感觉这个延迟加载的作用,是代理模式其他用途的一个基点

    2,因为刚刚总结了单例模式,我就在想,创建真实对象的时候,可不可以使用单例的思想,永远只允许有一个真实的对象。因为如果按照现有的代码,如果是多个线程同时访问的话,除了会创建多个代理类,也势必会创建多个真实的对象。事实上,我们需要的是多个代理,而不是多个真实类,对不对??????

    下篇博客,写代码做一下这个实现,好吧,其实我只是想用一下CountDownLatch这个玩意儿模拟并发而已。。。。。。

  • 相关阅读:
    ERROR 000732:Output Geodatabase:Dataset Database ConnectionsConnection to localhost.sdeSDE.Dataset does not exist or is not supported
    【转】通过 INotifyPropertyChanged 实现观察者模式
    Fatal NI connect error 6413的解决办法 http://www.itpub.net/thread-107518-1-1.html
    Oracle impdp的ignore及 fromuser / touser 功能
    进度条插件使用demo
    两个div并列居中显示——当display:inline-block;时,两个div无法对齐即一高一矮
    两个div并列居中显示——当display:inline;时,div的宽高不起作用即两个div重叠显示
    轮播插件unslider.min.js使用demo
    WEB网页如何让背景图片跟随可视窗口自适应大小
    火狐浏览器不支持location.reload()(以改变页面大小时重新刷新页面为例)
  • 原文地址:https://www.cnblogs.com/hhx626/p/7534611.html
Copyright © 2020-2023  润新知