疑惑集币?
1.為什么要寫(xiě)這篇文章
2.為什么要使用靜態(tài)代理以及好處
為什么要寫(xiě)這篇文章
在google百度輸入Java代理鳄厌,會(huì)出來(lái)各種分析Java代理的文章吴汪,尤其是排名靠前的幾篇分析的特別透徹激捏,而我還寫(xiě)關(guān)于Java代理的文章似乎已經(jīng)沒(méi)有意義了,其實(shí)沧竟,并不是這樣的,我覺(jué)得開(kāi)始做任何事缚忧,一開(kāi)始的心態(tài)要擺正悟泵,不然是不能堅(jiān)持下去的,寫(xiě)文章最大的好處是讓自己慢慢學(xué)會(huì)自律闪水,在這過(guò)程中無(wú)論是在技術(shù)上還是文筆表達(dá)上都會(huì)有質(zhì)的飛躍糕非,對(duì)自己的提升是非常有幫助的,因?yàn)槭莿傞_(kāi)始寫(xiě)文章嘛球榆,而且技術(shù)還在提升中朽肥,可能對(duì)某些東西的理解還不能很深入。但總得慢慢來(lái)嘛持钉,有一句俗話說(shuō)的好衡招!“猥瑣發(fā)育!別浪右钾!” 蚁吝,對(duì)!現(xiàn)在正是發(fā)育的時(shí)候舀射,少漏點(diǎn)刀窘茁,多刷野。當(dāng)寫(xiě)完這篇文章時(shí)脆烟,我想我會(huì)對(duì)Java代理模式的理解會(huì)更加深入山林。
為什么要使用靜態(tài)代理以及好處
舉個(gè)過(guò)濾自來(lái)水的例子,因?yàn)樽詠?lái)水本身是比較臟的邢羔,我們一般不會(huì)直接接自來(lái)水喝驼抹,但是我們可以通過(guò)自來(lái)水過(guò)濾器來(lái)讓自來(lái)水變成能喝的水。下面是這個(gè)例子的代碼實(shí)現(xiàn)拜鹤。
定義一個(gè)公共接口框冀,作用嘛!有一大堆理論敏簿,什么面向抽象編程啦明也!面向接口編程啦宣虾!依賴倒轉(zhuǎn)原則啊,兩個(gè)類盡量別產(chǎn)生直接關(guān)系温数,通過(guò)第三方抽象產(chǎn)生依賴~~~ 這些東西需要有一定代碼量绣硝,自然而然的就能明白,到那時(shí)你就會(huì)感覺(jué)使用接口有種預(yù)知未來(lái)的感覺(jué)撑刺,對(duì)于初學(xué)者不用著急著理解接口的含義鹉胖,不理解先放放,沒(méi)事够傍。
interface Water{
void getWater();
}
定義一個(gè)自來(lái)水類(也就是委托類(也就是被代理的類))實(shí)現(xiàn)Water接口中g(shù)etWater()方法甫菠,那么就代表這個(gè)類有了獲取水的能力,但是這個(gè)水是沒(méi)有處理過(guò)的王带,不能直接飲用淑蔚。
public class TapWater implements Water{
public void createWater(){
System.out.println("自來(lái)水有點(diǎn)臟!");
}
}
定義一個(gè)過(guò)濾自來(lái)水的類TapWaterFilter(也就是代理類)也是實(shí)現(xiàn)Water中g(shù)etWater()方法愕撰,同樣也有獲取水的能力刹衫,只是這個(gè)水是經(jīng)過(guò)處理的水可以直接飲用。
public class TapWaterFilter implements Water{
private Water mWater;
TapWaterFilter(Water water){
this.mWater = water;
}
public void getWater(){
System.out.println("去超市買(mǎi)明礬搞挣,半透膜...");
mWater.createWater();
System.out.println("通過(guò)半透膜法带迟、沉淀法、吸附法過(guò)濾囱桨,自來(lái)水變純凈水...");
}
}
客戶端的使用如下:
public static void main(String[] args){
TapWater tapWater = new TapWater();
TapWaterFilter tapWaterFilter = new TapWaterFilter(tapWater);
tapWaterFilter.createWater();
}
因?yàn)槔颖容^簡(jiǎn)單仓犬,可能有人會(huì)說(shuō)干嘛這么麻煩,直接改自來(lái)水類不來(lái)得更實(shí)在嘛舍肠,干啥還要定義一個(gè)TapWaterFilter類拐彎抹角的過(guò)濾自來(lái)水搀继。
static class TapWater implements Water{
public void createWater(){
System.out.println("去超市買(mǎi)明礬,半透膜...");
System.out.println("自來(lái)水有點(diǎn)臟翠语!");
System.out.println("通過(guò)半透膜法叽躯、沉淀法、吸附法過(guò)濾肌括,自來(lái)水變純凈水...");
}
}
像上面這么改点骑,直接改自來(lái)水類中的getWater()方法,不使用TabWaterFilter處理自來(lái)水谍夭,從設(shè)計(jì)模式元?jiǎng)t上來(lái)分析缺點(diǎn)有
1.破壞了單一職責(zé)元?jiǎng)t
我在寫(xiě)代碼的時(shí)候黑滴,當(dāng)發(fā)現(xiàn)自己寫(xiě)的函數(shù)特別臃腫,復(fù)用性差紧索,查看整個(gè)類袁辈,發(fā)現(xiàn)好多地方都是重復(fù)代碼時(shí),我會(huì)考慮去重構(gòu)某些函數(shù)珠漂,首先就會(huì)去考慮這個(gè)函數(shù)是否越職能了吵瞻,它是否完成多項(xiàng)功能葛菇,這樣的話甘磨,就有必要把這個(gè)多余的功能單獨(dú)抽出來(lái)寫(xiě)一個(gè)函數(shù)橡羞,像上面的例子直接改自來(lái)水類(TapWater)中的getWater()方法,也就直接讓getWater負(fù)責(zé)多項(xiàng)職能了济舆,但是你可能會(huì)說(shuō)過(guò)濾自來(lái)水(TapWaterFilter)類不就是處理多項(xiàng)職能了嗎卿泽,但是別忘了,這個(gè)類是TapWater的代理類滋觉,起到方法增強(qiáng)的功能签夭,為了不破壞TapWater中g(shù)etWater單一職責(zé)元?jiǎng)t,我們才這樣設(shè)計(jì)TapWaterFilter中的getWater椎侠,并且他的核心職能也只有一個(gè)第租,那就是造出純凈水,只有這樣我纪,當(dāng)我們還需使用自來(lái)水澆花時(shí)我們會(huì)慶幸當(dāng)初沒(méi)有讓TapWater中的getWater造出純凈水來(lái)慎宾,而是使用代理類來(lái)完成這項(xiàng)職能。
2.違背了開(kāi)閉元?jiǎng)t
開(kāi)閉元?jiǎng)t是這樣定義的浅悉,對(duì)擴(kuò)展開(kāi)放趟据,對(duì)修改關(guān)閉,相當(dāng)抽象术健,但是這兩句話高度概括了設(shè)計(jì)模式的目的汹碱,我們之所以使用設(shè)計(jì)模式,無(wú)非就是設(shè)計(jì)一個(gè)可輕易擴(kuò)展荞估,讓模塊與模塊之間可使用組裝式的方式來(lái)產(chǎn)生聯(lián)系咳促。
代理模式正是遵循了這一元?jiǎng)t,它并未產(chǎn)生對(duì)原來(lái)代碼的修改勘伺,客戶端的代碼是原封未動(dòng)的跪腹,并且它擴(kuò)展了原來(lái)代碼的功能。