动态代理模式
大一菜鸡的个人笔记,欢迎交流。
动态代理模式
意义
使真实角色的任务更加纯粹。
代理角色实现了任务的分工
业务扩展的时候 方便集中管理
一个动态代理类可以代理多个类(方便添加功能)
简介
动态代理和静态代理角色一样
动态代理的代理类是动态生成的,不是我们直接写好的
动态代理分为两大类:基于接口的动态代理,基于类的动态代理
- 基于接口: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();
}
}
动态代理模式的优势就是可以利用反射对方法进行拓展,不需要像静态代理模式那样对以前的代码进行修改,动态代理模式符合闭包原则。
代理模式-静态代理模式 代理模式-动态代理(基于接口,JDK动态代理)动态代理是代理模式吗
代理模式(静态代理模式、动态代理模式、cgLib代理模式、拦截器)动态代理模式
设计模式之代理模式、动态代理模式、Cglib代理模式动态代理是代理模式吗
【设计模式】代理模式 ( 动态代理使用流程 | 创建目标对象 | 创建被代理对象 | 创建调用处理程序 | 动态创建代理对象 | 动态代理调用 )动态代理是代理模式吗
代理模式-动态代理详解(JDK动态代理和CGLIB动态代理)jdk cglib动态代理
代理模式-动态代理(基于接口,JDK动态代理)jdk动态代理和cglib动态代理
代理模式之静态代理,JDK动态代理和cglib动态代理jdk cglib动态代理
设计模式之代理模式(包含静态代理和动态代理)设计模式的代理模式