https://blog.csdn.net/briblue/article/details/73928350? ?基于此篇博客整理的感悟,再次多謝大佬
看retrofit,看到了動(dòng)態(tài)代理,并沒(méi)有實(shí)際是使用。目前只是基于上述博客整理,之后有新的感悟會(huì)更新 。。。
有大佬看了有什么不對(duì)的請(qǐng)多指正,愿意獻(xiàn)上膝蓋
代碼中的代理:使用共同的接口實(shí)現(xiàn)功能的增強(qiáng)?;陂_(kāi)放封閉原則,新增是允許的,修改是不允許的。
靜態(tài)代理
要有一個(gè)接口作為功能實(shí)現(xiàn)? (電影播放 )
實(shí)例? 實(shí)現(xiàn)電影播放的接口? (電影)
代理類(lèi)?? 實(shí)現(xiàn)電影播放的接口(電影院)? ?電影院接收電影實(shí)例,在自己的接口方法實(shí)現(xiàn)實(shí)例的接口方法,可以加入自己的需要的功能(播廣告)
實(shí)現(xiàn):?實(shí)例化真實(shí)的實(shí)例類(lèi),實(shí)例化代理類(lèi)傳入實(shí)例對(duì)象(由接口接收)并且實(shí)現(xiàn)接口的功能即可??
代理類(lèi)實(shí)現(xiàn)了接口的功能,在不修改實(shí)例的情況下,可以進(jìn)行功能的增強(qiáng)。
這符合封閉開(kāi)放原則,(增強(qiáng)了功能的實(shí)現(xiàn),卻不修改之前的代碼,只是增加了代碼,提高了復(fù)用率)
問(wèn)題:如果我們想實(shí)現(xiàn)新的功能呢,肯定會(huì)有一個(gè)新的接口,對(duì)應(yīng)寫(xiě)一個(gè)新的代理類(lèi)(不能修改之前的代碼)
動(dòng)態(tài)代理
原理和靜態(tài)代理是一樣的,代理類(lèi)和實(shí)力類(lèi)實(shí)現(xiàn)相同的功能,但是動(dòng)態(tài)代理類(lèi)不需要自己在預(yù)先寫(xiě)代理類(lèi)了,只是通過(guò)代碼反射生成代理類(lèi)來(lái)實(shí)現(xiàn)對(duì)應(yīng)實(shí)現(xiàn)的功能。
要有一個(gè)接口作為功能實(shí)現(xiàn)? (電影播放 )
實(shí)例實(shí)現(xiàn)電影播放的接口? (電影)
一個(gè)實(shí)現(xiàn)了 InvocationHandler接口的類(lèi)?同樣要接收實(shí)例類(lèi),并且 在其invoke方法中實(shí)現(xiàn)類(lèi)似代理類(lèi)需要實(shí)現(xiàn)的功能增強(qiáng)?
實(shí)現(xiàn):?實(shí)例化真實(shí)的實(shí)例類(lèi),實(shí)例化實(shí)現(xiàn)?InvocationHandler接口的類(lèi)并傳入實(shí)例的類(lèi),通過(guò) Proxy 的靜態(tài)方法 newProxyInstance 才會(huì)動(dòng)態(tài)創(chuàng)建代理類(lèi)(由接口接收),執(zhí)行接口的方法。
newProxyInstance 方法的三個(gè)參數(shù)? 實(shí)例類(lèi)的類(lèi)加載器,功能的接口,實(shí)現(xiàn)InvocationHandler接口的類(lèi)。
所以如果想要增加新的功能實(shí)現(xiàn),這個(gè)時(shí)候只需要寫(xiě)新的接口以及實(shí)例類(lèi),還是用之前的實(shí)現(xiàn)InvocationHandler接口的類(lèi)即可
此時(shí)動(dòng)態(tài)生成的代理類(lèi)是對(duì)應(yīng)接口的,一個(gè)接口一個(gè)類(lèi),類(lèi)在內(nèi)存中