大话Java代理模式
一、什么是代理
首先理解一下什么是代理。简单来说,代理就你要做一件事情,我替你把事情做了。这是现实生活中我们遇到的代理的需求场景。但写代码的时候对代理场景的需求,跟现实场景有点区别,本质上还是帮你做事(调用要执行的方法),但在代码世界里,如果仅仅只是把要调用的方法执行了,那完全没有必要再新建类(代理类)去执行,因此,编码的代理场景,更多体现在,我不但要替你把原本先做的事情(调用方法)做了,我还要把你不需要做、或不想做的事情给做了,我们称其为方法的增强。
二、代理方式
众所周知,java里面的代理模式分为静态代理和动态代理两种方式。那如何理解这两种代理方式呢?以前我总认为这两种方式是对立的,这给我的理解带来不小的阻碍。其实不然,后来我才发现,它们并不对立,而是解决编码的过程中代理的两种不同场景而已。
前面我们提到,编码的代理需求,更多体现在于方法的增强。围绕这个核心,有利于我们更好的理解两者的异同。
- 静态代理
首先我们举一个静态代理的使用场景,有利于我们更好的理解。我始终相信每一项技术的发展,都是来着现实生活的推动。因此我们可以找一个现实场景进行类比。
比如近两年的新冠疫情。在此插一句,祝人类早日战胜疫情,早日摆脱口罩的束缚,早日自由畅快地呼吸。提到战胜疫情,就不得不提到疫苗,人类想战胜疫情,目前最好的方式就是疫苗的研发。那疫苗跟我们代理有啥关系呢?
我们都知道,疫苗在研发处理的初期,都是比较紧缺的,所以在初期,对疫苗的使用,肯定是先给最需要的人先使用。比如先给一线医护人员使用。那打疫苗就得报名,她们还被告知是手动填表报名,可能我们的没了的医护天使在一线抗战都非常忙,没有时间报名,那这个时候有个小聪明就想,我也要为疫情抗战出一份力,我没法到一线工作,我只是能帮一线医护人员报名,帮他们代理报名。这时候,一线医护人员是一个特定的群体(对应我们的类),手动填表报名是一个要被代理的特定动作(一个方法),小聪明(代理类)代理报名。
为特定的类,固化的方法代理,我们称之为静态代理,是对原有业务逻辑的扩充。小聪明很明确,他要为一线医护天使报名打疫苗,并处理一些杂七杂八的事情,不耽误他们的工作。
- 动态代理
后来随着疫苗生产的加速推进,疫苗越来越多。对越来越多的群体开放,学生想报名,工人想报名,画家想报名,程序员也想报名的,叫不上名的人都想报名。这时原先的手动填表已经满足不了需求了。需求,没错,就是需求推动社会的进步,技术的发展。这时政府相关机构会开发通道,让更多有能力的人或机构来帮忙解决报名的事情。你会看到,现在琳琅满目的报名方式:网站报名,社区报名,小程序报名,各式各样的报名方式被开发出来,只为一件事,就是报名。
对应我们的编程,其实的就是写一个接口,报名渠道,比如说小程序,开放报名通道就是接口里面提供报名的方法,不断增加的各类群体都想通过小程序报名,是对接口方法的实现,小程序不断的完善自己对各类群体的报名支持,我们可以理解为动态生成代理类。然后小程序完成报名,就是对人们报名需求的代理。通过这些代理进行报名,可以快速获上交材料,获得报名资格,这是对方法的增强。
- 区别
可以看到,静态代理和动态代理都提到了方法的增强,这是我们一直强调的代理的场景。那他们有什么不同呢。从上面例子不难理解,动态代理是为了解决静态代理的局限性而产生的。静态代理是对类里特定方法的增强,而动态代理是对接口的里方法的增强,只要实现该接口的类,都能实现方法的增强。由于实现接口的方法可以有无数个类,所以才有了动态代理的需求