zoukankan      html  css  js  c++  java
  • 程序设计优化——(2)代理模式(基本原理实现)

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

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

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

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

    1.代理模式的结构

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

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

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

      4)Main:客户端

    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,完全不需要啥时间,而加载真实主题需要的时间完全就是真实业务逻辑的执行时间。将代理模式用于是实现延迟加载,可以有效地替身系统的启动速度,对改善用户体验有很大的帮助。

  • 相关阅读:
    eclipse打包
    java reflect 小例子
    linux查看java jdk安装路径和设置环境变量
    mapreduce (一) 物理图解+逻辑图解
    java url 解码 编码 奇怪的解码两次
    cygwin+hadoop+eclipse (三) 运行wordcount实例
    nutch 与 solr 的结合
    一个项目可以有多个源代码路径
    SHAppBarMessage
    记录系统开机启动登录注销等信息
  • 原文地址:https://www.cnblogs.com/sun-flower1314/p/11747531.html
Copyright © 2011-2022 走看看