程序设计优化——(2)代理模式(基本原理实现)

  简介:代理模式使用代理对象完成用户请求,屏蔽用户对真实对象的访问。就如同现实中的代理同样,代理人被受权执行当事人的一些事,而无需当事人出面。java

  代理的做用:①基于安全考虑,须要屏蔽客户端直接访问真实对象;②提高系统性能和反应速度,对真实对象进行封装,冬儿达到延迟加载的目的。数据库

   好比在系统在启动时,初始化系统全部的类,若全部的类都是去得到真实链接,速度缓慢且耗损内存,而且可能有些初始化后根本不会被调用,而使用代理模式是初始化这个代理类,而非真实的主题。当系统真正启动功后,再使用这个功能时,再去经过代理类去构造真实主题实现真实逻辑。好比数据库链接;网络链接等。安全

  延迟加载的核心思想:若是没有真实使用某个组件时,不须要真正地初始化它,只有在真正使用的时候,才对它进行加载。(在时间轴上可以分散系统压力)网络

1.代理模式的结构性能

  1)主题接口:定义代理类和真实主题的公共对外接口,即代理类代理真实主题的方法。测试

  2)真实主题:真正实现业务逻辑的类spa

  3)代理类:用来代理和封装真实主题代理

  4)Main:客户端code

2.代理模式的实现和使用对象

  1)主题接口 

  IDBQuery.java

    package com.hxc.proxy.proxyMode;
    
    /**
     * <p>Description: 主题接口</p>
     * @author Huang Xiaocong
     * @data 2019年10月27日
     */
    public interface IDBQuery {
        String request();
    }

 

  2)真实主题  

  DBQuery.java

    package com.hxc.proxy.proxyMode;
    /**
     * <p>Description: 真实主题</p>
     * @author Huang Xiaocong
     * @data 2019年10月27日
     */
    public class DBQuery implements IDBQuery {
    
        public DBQuery() {
            try {
                Thread.sleep(1000);    //模拟执行过程
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        public String request() {
            return "request String";
        }
    
    }

 

  3)代理类 建立过程很快,用于替代DBQuery.java(真实主题)

  DBQueryProxy.java
    package com.hxc.proxy.proxyMode;
    /**
     * <p>Description: 代理类</p>
     * @author Huang Xiaocong
     * @data 2019年10月27日
     */
    public class DBQueryProxy implements IDBQuery {
    
        private DBQuery real = null;
        public String request() {
            if(real == null) {
                real = new DBQuery();
            }
            return real.request();
        }
        
    }

 

  4)客户端(测试类)

  Main.java

    package com.hxc.proxy.proxyMode;
    /**
     * <p>Description: 客户端</p>
     * @author Huang Xiaocong
     * @data 2019年10月27日
     */
    public class Main {
        
        public static void main(String[] args) {
            long begin = System.currentTimeMillis(); 
            IDBQuery dbQuery = new DBQueryProxy();
            System.out.println("DBQueryProxy time is : " + (System.currentTimeMillis() - begin));
            begin = System.currentTimeMillis();
            String request = dbQuery.request();
            System.out.println(request);
            System.out.println("DBQuery time is : " + (System.currentTimeMillis() - begin));
        }
    }

 在笔者的控制台输出结果以下:

DBQueryProxy time is : 0
request String
DBQuery time is : 1002

 

从上面结果能够看到,加载代理模式的时间为0,彻底不须要啥时间,而加载真实主题须要的时间彻底就是真实业务逻辑的执行时间。将代理模式用因而实现延迟加载,能够有效地替身系统的启动速度,对改善用户体验有很大的帮助。

相关文章
相关标签/搜索