当前位置:首页 > CN2资讯 > 正文内容

动态代理模式

9小时前CN2资讯


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

动态代理模式

意义

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

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

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

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

简介

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

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

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

  • 基于接口: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();
}
}


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


    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/24635.html

    分享给朋友:

    “动态代理模式” 的相关文章