一、代理模式介紹
代理是一種設(shè)計模式亏钩,主要用于在我們訪問目標(biāo)對象時莲绰,在不修改目標(biāo)對象的前提下姑丑,可以對目標(biāo)對象提供的功能進行一定的擴展蛤签。
代理可分為靜態(tài)代理栅哀、動態(tài)代理以及三方庫 cblib代理
二震肮、靜態(tài)代理
這種代理需要額外寫一個代理類,和目標(biāo)對象實現(xiàn)一樣的接口戳晌。
優(yōu)點:實現(xiàn)方式簡單鲫尊,易理解
缺點:
1.代碼冗余沦偎,需要額外生成代理類
2.不易維護,一旦接口有變化豪嚎,代理類和目標(biāo)對象都需要改動
舉例:
接口類:I
public interface ITest {
public void test();
}
實現(xiàn)類
public class TestImpl1 implements ITest {
@Override
public void test() {
Log.i("test","test1");
}
}
public class TestImpl2 implements ITest {
@Override
public void test() {
Log.i("test","test2");
}
}
代理類
public class TestProxy implements ITest {
private ITest target;
public TestProxy(ITest test) {
target = test;
}
@Override
public void test() {
Log.i("test", "before");
target.test();
Log.i("test", "after");
}
}
在使用時搔驼,我們不再直接使用 TestImpl1或TestImpl2侈询,而使用TestProxy對象舌涨,并將目標(biāo)對象傳入TestProxy中扔字,在調(diào)用目標(biāo)對象前后囊嘉,增加一些相應(yīng)的處理革为,以達(dá)到代理的目的。
三篷角、動態(tài)代理
從上述代碼中焊刹,我們能明顯看到靜態(tài)代理在開發(fā)及維護上的弊端恳蹲,因此有了動態(tài)代理。
靜態(tài)代理是編譯時根據(jù)我們寫的代碼生成.class文件來實現(xiàn)的嘉蕾,而動態(tài)代理則不一樣,它是在程序運行時動態(tài)生成相應(yīng)的.class文件
動態(tài)代理類
public class TestProxyFactory {
private ITest target;
public TestProxyFactory(ITest test) {
target = test;
}
public Object getProxyInstance() {
//返回目標(biāo)類的代理類
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Log.i("test", "before");
method.invoke(target, args);
Log.i("test", "after");
return null;
}
});
}
}
從上述動態(tài)代理代碼可以看出错忱,不再需要我們額外的寫代理類了,隨后目標(biāo)類有任何的功能增減挂据,都不會影響其他代碼
四、cglib
這是三方提供的一個類庫崎逃,具體我也沒用過,這里只是給大家普及一下知識點个绍,從上面動態(tài)代理可以看出勒葱,其需要依賴于一個接口,而cblib最大的優(yōu)點是不再依賴于接口.具體的用法大家就自己研究了凛虽。
關(guān)于動態(tài)代理生成的$proxy0類的代碼,參照以下:https://blog.csdn.net/zhao_zepeng/article/details/55050627