java开发,必须要懂的23种设计模式——代理模式(动态JDK代理模式)

目录

提醒:

动态代理是什么?

JDK代理是什么?

JDK代理小案例:

小结:

与静态代理的区别:

不同:

相同:


提醒:

动态代理已经属于稍高级的代理方式了,如果不理解代理模式是什么,建议先看看我另一篇文章,会详细讲解代理模式是什么。

 

java开发,必须要懂的23种设计模式——代理模式(静态代理模式)

 

 

 

动态代理是什么?

动态和静态是相对的,既然静态是被代理对象不能变化,那么动态就是被代理对象可以变化的代理模式。

JDK代理是什么?

JDK代理是java-jdk内置的一个方法,我们只要按照api文档去使用这个方法可以实现动态代理。

具体怎么使用这个方法,做个小案例看看就知道了。

JDK代理小案例:

假设你是卖面膜的,我是你的代理。我可以把面膜卖给我的朋友。

卖面膜接口

package 代理模式.动态代理;

public interface IMaskSeller {
	// 买面膜方法
	void sellMask();
}


你——被代理者

package 代理模式.动态代理;
// 你是被代理对象
public class You implements IMaskSeller {

	@Override
	public void sellMask() {
		System.out.println("卖面膜");
	}

}


我——生成代理的类

这个类并不是代理类,而是调用了JDK的方法生成了一个代理类,并且把代理类返回给调用者。

package 代理模式.动态代理;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

// 我代理你
public class Me {
	
	private Object target;
	
	public Me(Object target) {
		this.target=target;
	}

	/**
	 * 这个方法返回的对象是个在内存中生成的代理类
	 * 
	 * 返回值中,调用了JDK的Proxy类的newProxyInstance方法。这个方法需要传入三个参数。
	 * 		参数1——被代理类的类加载器
	 * 		参数2——被代理类的接口
	 * 		参数3——调用被代理类的方法时触发的方法
	 * @return
	 */
	public Object getYouInstance() {
		return Proxy.newProxyInstance(
				target.getClass().getClassLoader(), 
				target.getClass().getInterfaces(), 
				new InvocationHandler() {
					@Override
					public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
						System.out.println("我是代理,能把面膜卖给自己的盆友");
						
						// 调用被代理类的方法,returnValue是方法执行的返回值。
						Object returnValue = method.invoke(target, args);
						return returnValue;
					}
					
				});
	}
}


我的朋友——客户端

package 代理模式.动态代理;
// 相当于客户端
public class MyFriend {

	public static void main(String[] args) {
		// 被代理对象
		You you = new You();
		
		// 获取动态代理对象
		IMaskSeller me = (IMaskSeller) new Me(you).getYouInstance();
		me.sellMask();
	}

}

小结:

如上所示:

1. 实现同代代理的关键是:Proxy.newProxyInstance方法,我们只需要按照方法的注释填写相应的参数就行。

与静态代理的区别:

不同:

看过我讲静态代理模式的童鞋,应该可以看出,他们的不同之处:
 

不同1:

静态代理是代理固定的类,需要实现接口,

动态代理生成类不需要实现接口。

不同2:

动态代理使用Proxy.newProxyInstance方法,动态生成了一个代理类。

不同:

获取代理类的方法不是,

静态代理直接实例化代理类。

动态代理调用getYouInstance获取代理类。

相同:

静态代理模式和动态代理模式(JDK代理)的实现原理是一样的。

本质上都是实现共同的接口,然后去实现的代理模式。

只不过,静态代理,是我们自己写好的代理类,动态代理是在内存中,动态的去创建了一个接口的代理类。

 

以上为个人所学和总结,如果那里不对,希望看到的大佬指正!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值