动态代理模式

大一菜鸡的个人笔记,欢迎交流。

动态代理模式

意义

使真实角色的任务更加纯粹。

代理角色实现了任务的分工

业务扩展的时候 方便集中管理

一个动态代理类可以代理多个类(方便添加功能)

简介

动态代理和静态代理角色一样

动态代理的代理类是动态生成的,不是我们直接写好的

动态代理分为两大类:基于接口的动态代理,基于类的动态代理

  • 基于接口:JDK动态代理
  • 基于类:cglib

需要了解两个类:Proxy、invokatio

/**
 * @author:zmc
 * @function:
 * @date: 2020/7/13 15:37
 */
public interface Rent {
    public void rent();
}
/**
 * @author:zmc
 * @function:
 * @date: 2020/7/13 15:38
 */
public class Host implements Rent{

    @Override
    public void rent() {
        System.out.println("房东要出租房子");
    }
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author:zmc
 * @function:
 * @date: 2020/7/13 15:40
 */
//用这个类生成代理类
public class ProxyInvocationHandler implements InvocationHandler {

    //被代理的接口
    private Rent rent;

    public void setRent(Rent rent) {
        this.rent = rent;
    }

    //得到代理类
    public Object getProxy(){
      return Proxy.newProxyInstance(this.getClass().getClassLoader(),
                rent.getClass().getInterfaces(),this);
    }
    @Override
    public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
        seeHouse();
        //动态代理的本质,就是使用反射机制实现
        Object result = method.invoke(rent, objects);
        fare();
        return null;
    }
    public void seeHouse(){
        System.out.println("中介带看房子");
    }
    public void fare(){
        System.out.println("收中介费");
    }
}
/**
 * @author:zmc
 * @function:
 * @date: 2020/7/13 16:06
 */
public class Client {
    public static void main(String[] args) {
        //真实角色
        Host host = new Host();
        //代理角色
        ProxyInvocationHandler pih = new ProxyInvocationHandler();
        //通过调用程序处理角色来处理我们调用的接口对象
        pih.setRent(host);
        //这里的proxy就是动态生成的
        Rent proxy = (Rent)pih.getProxy();
        proxy.rent();
    }
}
 {
        seeHouse();
        //动态代理的本质,就是使用反射机制实现
        Object result = method.invoke(rent, objects);
        fare();
        return null;
    }
    public void seeHouse(){
        System.out.println("中介带看房子");
    }
    public void fare(){
        System.out.println("收中介费");
    }
}
/**
 * @author:zmc
 * @function:
 * @date: 2020/7/13 16:06
 */
public class Client {
    public static void main(String[] args) {
        //真实角色
        Host host = new Host();
        //代理角色
        ProxyInvocationHandler pih = new ProxyInvocationHandler();
        //通过调用程序处理角色来处理我们调用的接口对象
        pih.setRent(host);
        //这里的proxy就是动态生成的
        Rent proxy = (Rent)pih.getProxy();
        proxy.rent();
    }
}

动态代理模式_第1张图片
动态代理模式的优势就是可以利用反射对方法进行拓展,不需要像静态代理模式那样对以前的代码进行修改,动态代理模式符合闭包原则。

你可能感兴趣的:(笔记)