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

    一. 静态代理

    •   代理类实现被代理类实现的接口 或者 继承被代理类继承的父类;(这一项可以没有)
    •   代理类持有被代理类的引用;
    •   调用代理类方法时通过被代理类的引用调用被代理类的方法,并在调用方法前后可进行其他操作;

      代码示例:

    package com.skd.designMode.proxy;
    
    /**
     *  代理类
     *  对于每个代理的方法必须手动逐个添加代理前后的操作
     */
    public class StaticProxy implements Phone
    {
        // 持有被代理类的引用
        private Xiaomi xiaomi;
        
        public StaticProxy(Xiaomi xiaomi)
        {
            this.xiaomi = xiaomi;
        }
    
        @Override
        public void call()
        {
            // 调用方法之前
            System.out.println("指纹解锁");
            // 调用方法
            xiaomi.call();
            // 调用方法之后
            System.out.println("砸手机");
        }
    
    }
    
    
    /**
     *  共同实现的接口
     */
    interface Phone{
        void call ();
    }
    
    /**
     *  被代理类
     */
    class Xiaomi implements Phone{
    
        @Override
        public void call()
        {
            System.out.println("小爱同学,打电话给雷军");
        }
        
    }

    二. 动态代理

    • 代理类必须实现被代理类实现的接口 (只能是接口)
    • 代理类持有被代理类的引用;
    • 调用代理类方法时通过被代理类的引用调用被代理类的方法,并在调用方法前后可进行其他操作; 对代理类的所有方法添加一套方法执行前后的逻辑操作
    package com.skd.designMode.proxy;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    /**
     *  动态代理
     *  必须实现相同的接口(必须是接口)
     *  对代理类的所有方法调用前后添加一套逻辑
     */
    public class DynamicProxy implements InvocationHandler
    {
        // 持有被代理类的引用
        private ProxyedPhone phone;
        
        public DynamicProxy(ProxyedPhone phone)
        {
            this.phone = phone;
        }
    
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
        {
            // 代理之前
            System.out.println("打开流量");
            // 代理
            Object invoke = method.invoke(phone, args);
            // 代理之后
            System.out.println("关闭流量");
            return invoke;
        }
        
        public static void main(String[] args)
        {
            ProxyedPhone phone = new ProxyedPhone();
            DynamicProxy handle = new DynamicProxy(phone);
            /*
             * 1.代理类的类加载器 
             * 2.代理类要实现的接口列表
             * 3.指派方法调用的调用处理程序
             */ 
            NBPhone proxy =(NBPhone) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{NBPhone.class}, handle);
            proxy.sendMsg();
            proxy.videoChat();
            /*        
             * 打开流量
             * 发个消息
             * 关闭流量
             * 
             * 打开流量
             * 视频一下
             * 关闭流量
             */
        }
    
    }
    
    /**
     *  共同接口
     */
    interface NBPhone{
        void sendMsg();
        void videoChat();
    }
    
    /**
     *  被代理类
     */
    class ProxyedPhone implements NBPhone{
    
        @Override
        public void sendMsg()
        {
            System.out.println("发个消息");
        }
    
        @Override
        public void videoChat()
        {
            System.out.println("视频一下");
        }
        
    }

    三.  CGLIB动态代理

      简书: 深入理解CGLIB动态代理

      

    如果文章对您有所帮助,可以点一下推荐哦
  • 相关阅读:
    Ie console未定义
    jquery bind和live区别
    php insert 空
    ie8及以下不支持getElemlentsByClassName
    jquery ajax parseerror
    你的灯亮着吗——发现问题的真正所在(摘录)
    转:getElementById引起的jQuery的选择器bug
    JS判断是否为数字、JS判断是否为整数、JS判断是否为浮点数
    Microsoft .NET Framework 4 (Standalone Installer)
    Not enough memory is available to complete this request
  • 原文地址:https://www.cnblogs.com/virgosnail/p/9445749.html
Copyright © 2011-2022 走看看