Java代理设计模式、静态代理、动态代理
首先代理设计模式是基于接口的。分为静态代理和动态代理。
1.静态代理,darren大神例子,你去银行办卡,肯定有个业务员(业务员就是代理对象)来帮助你,带着你完成办卡这件事情。银行需要走很多手续什么的,你不懂。那么他拿你身份证,走流程他来做,你只需要最后输入密码啊,签字啊什么的。(本身所有的事情都应该你自己完成,但是这样对人来说很不方便。如果改了流程,所有人都得改)
静态代理的好处就是 速度更快、流程上如果发生变化只需要改变代理对象就行
静态代理不好的地方 如果还有办卡、挂失、代取款等等事情,代码量会增加(等会看静态代理就知道了)。
下面上代码:
一、这个接口IBank 就是你去银行要做的事情,假设为办卡和挂失
二、这里的Man表示 需要办业务的人,也就是你,他要办卡或者挂失本身是需要自己去做的,所以这里Man要实现这2个方法。
三、这里的Salesman就表示银行的业务员,首先他帮助你办卡,
1.他自己得知道怎么办,那么他就要实现IBank接口,重写方法。
2.他要帮你办卡那么要获得你的对象(man),
3.然后在进行办卡或者挂失先走一些七七八八的手续(这里的判断非空等)(这一步也就是代理模式的精髓,不管
是多少个人来办卡,或者挂失。都只需要走这一个流程,而不需要每个Man都执行。比如mvp 场景,在对view
赋值的时候,可以用代理模式来统一判断非空
)
4.再调用man的办卡或者挂失,(这时候你就输入密码等等事情)
四、这里的client,是入口函数。我们再使用的时候只需要new一个man,再把这个对象传入Saleman的构造。new一个saleMan,再调用saleMan的办卡方法。代理对象就会帮你执行了
这里还举了个例子,对于你叫室友给你带饭这个事情。
本身全部都需要你自己做,现在有了代理。你只需要付钱、室友给你代,中途所有的事情,室友给你处理。
以上就是静态代理。有一个明显的缺点,就是如果要做的事情多了之后,saleMan(代理对象)中“做一些事情”和“完毕”的输出就很多。代码量增加。代理对象越来越大。
这时候就出来动态代理,这里是根据java自带的Proxy代理模板来讲的
详解一下。
1.还是需要new一个Man对象。
2.实例化一个IBank类型的代理对象。需要一些参数
3.代理对象调用办卡、挂失等方法。
重点是 BankInvocationHandler这个类
需要传入你man对象。
这样的模式,每次你调用proxy.xxx方法都会回调 BankInvocationHandler中的invoke方法。
“做一些事情”,和“完毕”这些流程上的东西,都可以在 BankInvocationHandler中输出了。避免了saleMan越来越大