Java靜態(tài)代理

疑惑集币?

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)代碼的功能。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末娇昙,一起剝皮案震驚了整個(gè)濱河市尺迂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌冒掌,老刑警劉巖噪裕,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異股毫,居然都是意外死亡膳音,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)铃诬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)祭陷,“玉大人苍凛,你說(shuō)我怎么就攤上這事”荆” “怎么了醇蝴?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)想罕。 經(jīng)常有香客問(wèn)我悠栓,道長(zhǎng),這世上最難降的妖魔是什么按价? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任惭适,我火速辦了婚禮,結(jié)果婚禮上楼镐,老公的妹妹穿的比我還像新娘癞志。我一直安慰自己,他們只是感情好框产,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布凄杯。 她就那樣靜靜地躺著,像睡著了一般茅信。 火紅的嫁衣襯著肌膚如雪盾舌。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,708評(píng)論 1 305
  • 那天蘸鲸,我揣著相機(jī)與錄音妖谴,去河邊找鬼。 笑死酌摇,一個(gè)胖子當(dāng)著我的面吹牛膝舅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播窑多,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼仍稀,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了埂息?” 一聲冷哼從身側(cè)響起技潘,我...
    開(kāi)封第一講書(shū)人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎千康,沒(méi)想到半個(gè)月后享幽,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拾弃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年值桩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片豪椿。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡奔坟,死狀恐怖携栋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情咳秉,我是刑警寧澤婉支,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站滴某,受9級(jí)特大地震影響磅摹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜霎奢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望饼灿。 院中可真熱鬧幕侠,春花似錦、人聲如沸碍彭。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)庇忌。三九已至舞箍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間皆疹,已是汗流浹背疏橄。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留略就,地道東北人捎迫。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像表牢,于是被迫代替她去往敵國(guó)和親窄绒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容