Hello World

代理模式

一. 静态代理

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

  代码示例:

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

  

posted @ 2018-08-08 21:17  小小忧愁米粒大  阅读(144)  评论(0编辑  收藏  举报
瞅啥瞅,好好看书