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动态代理

      

    如果文章对您有所帮助,可以点一下推荐哦
  • 相关阅读:
    5月7号 跨页面传值
    实体类、数据访问类、属性扩展
    完整修改删除,防止数据库字符串攻击
    ADO.NET 增、删、改、查
    类库、委托、is as运算符、泛型集合
    抽象类、接口
    多态、虚方法、重写
    访问修饰符、封装、继承
    面向对象基础知识
    Java Script 练习题
  • 原文地址:https://www.cnblogs.com/virgosnail/p/9445749.html
Copyright © 2011-2022 走看看