代理模式的定義
為其他對象提供一種代理以控制對這個對象的訪問
代理模式的使用場景
當無法或不想直接訪問某個對象或訪問某個對象存在困難時可以通過一個代理對象來間接訪問甩栈,為了保證客戶端使用的透明性,委托對象與代理對象需要實現(xiàn)同一個接口
根據(jù)代理類生成的時間不同可以分為靜態(tài)代理和動態(tài)代理兩種
靜態(tài)代理
靜態(tài)代理中的代理類和委托類會實現(xiàn)同一接口
在程序運行之前批幌,代理類就已經(jīng)存在了康聂。
- 1個靜態(tài)代理 只服務(wù)1種類型的目標對象
- 協(xié)調(diào)調(diào)用者和被調(diào)用者,降低了系統(tǒng)的耦合度
- 代理對象作為客戶端和目標對象之間的中介,起到了保護目標對象的作用
- 在目標對象較多的情況下厂置,若采用靜態(tài)代理,則會出現(xiàn) 靜態(tài)代理對象量多魂角、代碼量大昵济,從而導(dǎo)致代碼復(fù)雜的問題
動態(tài)代理
動態(tài)代理類實現(xiàn)了InvocatuonHandler接口,并通過反射機制動態(tài)的生成代理者的對象,具體如下:
Proxy.newProxyInstance(loader, interfaces,invocationHandler)
- 1.通過為Proxy類指定類加載器對象 和 一組接口,從而創(chuàng)建動態(tài)代理類的字節(jié)碼野揪;再根據(jù)類字節(jié)碼創(chuàng)建動態(tài)代理類
- 2.通過反射機制獲取動態(tài)代理類的構(gòu)造函數(shù)(參數(shù)類型 = 調(diào)用處理器接口類型)
- 3.通過動態(tài)代理類的構(gòu)造函數(shù) 創(chuàng)建 代理類實例
在程序運行時访忿,代理類才產(chǎn)生。
- 只需要1個動態(tài)代理類就可以解決創(chuàng)建多個
- 相比靜態(tài)代理中 直接調(diào)用目標對象方法斯稳,動態(tài)代理則需要先通過java反射機制 從而 間接調(diào)用目標對象方法,所以效率低