動態(tài)代理模式屬于比較困難的一個設(shè)計模式什荣。
開發(fā)中用到的很少港令,因為動態(tài)代理模式的應(yīng)用場景是搭建框架粥诫,對于大部分人而言能用就可以了恭理,根本沒機(jī)會寫。
但是動態(tài)代理模式學(xué)習(xí)掌握明白去分析可以源碼很有幫助了灵迫。
一:靜態(tài)代理模式
事物的發(fā)展是有規(guī)律的疮薇,現(xiàn)有靜態(tài)才會有動態(tài)的需求福贞。
代理模式給某一個對象提供一個代理對象笤昨,并由代理對象控制對原對象的引用。通俗的來講代理模式就是我們生活中常見的中介握恳。
靜態(tài)代理在使用時,需要定義接口或者父類,被代理對象與代理對象一起實現(xiàn)相同的接口或者是繼承相同父類瞒窒。一般來說,被代理對象和代理對象是一對一的關(guān)系乡洼,當(dāng)然一個代理對象對應(yīng)多個被代理對象也是可以的崇裁。
靜態(tài)代理,一對一則會出現(xiàn)時靜態(tài)代理對象量多束昵、代碼量大拔稳,從而導(dǎo)致代碼復(fù)雜,可維護(hù)性差的問題锹雏。一對多則代理對象會出現(xiàn)擴(kuò)展能力差的問題巴比。
方案一:一對一,100個真實對象需要代理,那就寫出100個代理對象去代理轻绞,代碼多采记,修改工作量巨大。
方案二:一對多政勃,100個真實對象公用一個代理唧龄,那就需要1個代理和100個真實對象同時產(chǎn)生關(guān)系,關(guān)系非常復(fù)雜很難擴(kuò)展奸远。
所以靜態(tài)代理局限性很大既棺,只適合明確知道真實對象是誰,而且數(shù)量不多情況下懒叛。
如果不知道真實對象的名字丸冕,不知道會有多少真實對象需要代理的情況下根本無法使用
具體代碼:
二:反射
靜態(tài)存在局限,那只有動態(tài)代理去解決了
那就需要用到反射
Reflection(反射)是Java被視為動態(tài)語言的關(guān)鍵芍瑞,反射機(jī)制允許程序在執(zhí)行期借助于Reflection API取得任何類的內(nèi)部信息晨仑,并能直接操作任意對象的內(nèi)部屬性及方法。
反射就是在運行時才知道要操作的類是什么拆檬,并且可以在運行時獲取類的完整構(gòu)造洪己,并調(diào)用對應(yīng)的方法。
?在運行時構(gòu)造任意一個類的對象
?在運行時獲取任意一個類所具有的成員變量和方法
?在運行時調(diào)用任意一個對象的方法(屬性)
三動態(tài)代理模式
優(yōu)點
只需要1個動態(tài)代理類就可以解決創(chuàng)建多個靜態(tài)代理的問題竟贯,避免重復(fù)答捕、多余代碼,更強(qiáng)的靈活性
動態(tài)代理的服務(wù)內(nèi)容不需要像靜態(tài)代理一樣寫在每個代碼塊中屑那,只需要寫在invoke()方法中即可拱镐,降低了代碼的冗余度。
缺點
效率低持际,相比靜態(tài)代理中 直接調(diào)用目標(biāo)對象方法沃琅,動態(tài)代理則需要先通過Java反射機(jī)制 從而 間接調(diào)用目標(biāo)對象方法
動態(tài)代理類仍然需要實現(xiàn)接口。
靜態(tài)代理蜘欲,動態(tài)代理測試代碼
如果喜歡請點個start