zoukankan      html  css  js  c++  java
  • 设计模式 --- 代理模式

    静态代理:

     1 public interface ICalFab {
     2     int calFaByLoop(int n);
     3     int calFabByRecursion(int n); 
     4 }
     5 
     6 class CalFabImp implements ICalFab{
     7     @Override
     8     public int calFaByLoop(int n) {
     9         int n1=1,n2= 1,n3=0;
    10         for (int i = 3; i < n; i++) {
    11             n3=n1+n2;
    12             n1=n2;
    13             n2=n3;
    14         }
    15         return n3;
    16     }
    17     @Override
    18     public int calFabByRecursion(int n) {
    19         if(n==1||n==2) return 1;
    20         return calFabByRecursion(n-1)+calFabByRecursion(n-2);
    21         
    22     }
    23     
    24 }
    25 /**
    26  * 代理类往往依赖于被代理类
    27  * @author 
    28  */
    29 class CalFabImplProxy implements ICalFab{
    30     private ICalFab calFab;
    31     public CalFabImplProxy() {}
    32     public CalFabImplProxy(ICalFab calFab) {
    33         this.calFab =calFab;
    34     }
    35     @Override
    36     public int calFaByLoop(int n) {
    37         long start = System.currentTimeMillis();
    38         int result = calFab.calFaByLoop(n);
    39         long end = System.currentTimeMillis();
    40         System.out.println(end-start+"ms");
    41         return result;
    42     }
    43 
    44     @Override
    45     public int calFabByRecursion(int n) {
    46         long start = System.currentTimeMillis();
    47         int result = calFab.calFabByRecursion(n); 
    48         long end = System.currentTimeMillis();
    49         System.out.println(end-start+"ms");
    50         return result;
    51     }
    52     
    53 }
     1 public class Invoker {
     2     public static void main(String[] args) {
     3 //        ICalFab imp = new CalFabImp();
     4 //        System.out.println(imp.calFabByRecursion(10));;
     5 //        imp.calFaByLoop(10); 
     6         //-- 构造被代理对象
     7         ICalFab imp = new CalFabImp();
     8         //-- 构造代理对象
     9         CalFabImplProxy proxy = new CalFabImplProxy(imp);
    10         //-- 调用代理对象的业务方法:
    11         proxy.calFabByRecursion(50);
    12         proxy.calFaByLoop(50);
    13     }
    14 }

    动态代理:

    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    /**
     * 动态代理模式:实现框架底层的核心
     * (1) 构建InvocationHandler对象
     * (2) 构建动态代理对象(利用被代理对象和InvocationHandler对象)
     * @author 张泽
     */
    public class DynamicProxyDemo01 {
        public static void main(String[] args) {
            //-- 1. 构建被代理对象
            ICalFab calFab = new CalFabImp();
            //-- 2. 构造InvocationHandler对象
            CalFabInvocationHandler invocationHandler = 
                    new CalFabInvocationHandler(calFab); 
            //-- 3.构建动态代理对象
            //-- arg0 : 传被代理对象的类加载器对象
            //-- arg1 : 传入被代理对象的所实现的接口
            //-- arg3 : 传入InvocationHandler对象
            ICalFab dynamicProxy = (ICalFab)Proxy.newProxyInstance(
                    calFab.getClass().getClassLoader(),
                    calFab.getClass().getInterfaces(),
                    invocationHandler);
            //-- 4. 利用代理对象调用业务方法
            dynamicProxy.calFaByLoop(40);
            dynamicProxy.calFabByRecursion(40);
        }
    }
    
    
    //-- 编写InvocationHandler类要实现InvocationHandler接口
    class CalFabInvocationHandler implements InvocationHandler{
        private Object target;    //-- 被代理对象
        
        public CalFabInvocationHandler() {}
        public CalFabInvocationHandler(Object target) {
            this.target = target;
        }
        /**
         * @param proxy 代理对象,这个对象是在程序运行的过程中动态创建出来的
         * @param method 调用的方法
         * @param args 方法的参数
         * @return
         */
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) 
            throws Throwable {
            //-- 1. 业务代码前切入代码
            long start = System.currentTimeMillis();
            //-- 2. 业务代码
            Object result = method.invoke(target, args);//-- 调用被代理类的业务方法
            //-- 3. 业务代码后切入代码
            long end = System.currentTimeMillis();
            System.out.println((end - start)+"ms");
            return result;
        }
        
    }
  • 相关阅读:
    私活。
    sql server 模拟数组【转】
    Updlock 与 Holdlock
    连上交换机后电脑无法上网
    linux的发展
    MySQL5.7中,用root用户登陆不进去数据库,报以下错误,然后重新修改了密码,好了。
    nginx反响代理tomcat配置ssl
    tomcat日志的切割脚本
    重启nginx报错:[error] invalid PID number "" in "/application/nginx-1.13.3/logs/nginx.pid"
    数据盘的挂载
  • 原文地址:https://www.cnblogs.com/zhangze-lifetime/p/11757515.html
Copyright © 2011-2022 走看看