一、介紹
代理模式是一種設(shè)計(jì)模式,提供了對目標(biāo)對象額外的訪問方式,即通過代理對象訪問目標(biāo)對象,這樣可以在不修改原目標(biāo)對象的前提下,提供額外的功能操作,擴(kuò)展目標(biāo)對象的功能。
代理模式UML類圖
根據(jù)代理類的生成時(shí)間不同可以將代理分為靜態(tài)代理和動態(tài)代理兩種。
靜態(tài)代理即為JDK原生靜態(tài)代理。
而動態(tài)代理方式又可以分為兩種:
1. JDK原生動態(tài)代理
2. CGLIB動態(tài)代理。
靜態(tài)代理的對象在編譯時(shí)生成,而動態(tài)代理的對象只在程序運(yùn)行時(shí)生成,因此靜態(tài)代理的類會產(chǎn)生對應(yīng)的字節(jié)碼文件,動態(tài)代理則不然。
二、靜態(tài)代理
這種代理方式需要代理對象和目標(biāo)對象實(shí)現(xiàn)一樣的接口。
優(yōu)點(diǎn):
可以在不修改目標(biāo)對象的前提下擴(kuò)展目標(biāo)對象的功能。
缺點(diǎn):
1. 冗余。會產(chǎn)生過多的代理類。
2. 不易維護(hù)。隨著接口增加方法,目標(biāo)對象與代理對象都要進(jìn)行相應(yīng)修改。
// 接口interfaceHello{
? ? StringsayHello(String str);
}// 實(shí)現(xiàn)classHelloImpimplementsHello{
? ? @Override? ? publicStringsayHello(String str){
? ? ? ? return "HelloImp: " + str;
? ? }
}