zoukankan      html  css  js  c++  java
  • 【设计模式 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这个玩意儿模拟并发而已。。。。。。

  • 相关阅读:
    《Cracking the Coding Interview》——第6章:智力题——题目2
    《Cracking the Coding Interview》——第6章:智力题——题目1
    《Cracking the Coding Interview》——第5章:位操作——题目8
    《Cracking the Coding Interview》——第5章:位操作——题目7
    《Cracking the Coding Interview》——第5章:位操作——题目6
    Spyder 调出绘图界面
    作为非计算机专业的学生,觉得 C 语言远比其他语言易于上手,正常吗?
    vs2015 + Python3.5 环境搭建
    更新32位Spyder从3.0.0-> 3.2.3
    luogu P1047 校门外的树 x
  • 原文地址:https://www.cnblogs.com/hhx626/p/7534611.html
Copyright © 2011-2022 走看看