來源:北大青鳥總部 2023年03月09日 13:31
最近猿小二,在生活上遇到了一些挫折;既然是挫折,想來可能不是什么好事兒,但是對于身為程序員的猿小二來說,凡事兒總喜歡刨根問底,追求事物的本質(zhì),充分體現(xiàn)了程序員對任何事情都特別的認(rèn)真(一根筋)的人生態(tài)度;就像很多技術(shù)極客都信奉的"鋼鐵俠"所推崇的 "第一性原理",遇到問題總會探尋問題的本質(zhì)。
這不最近猿小二在租房子的時候,就將生活中的找中介租房的事情,跟酷酷的編碼聯(lián)系在了一起,更加深刻的理解了什么是"藝術(shù)來源于生活"
我們都知道,對于大部分"漂"來說,租房是關(guān)乎我們在一座城市生存下來的最根本的因素,所以幾乎每個人都逃脫不了租房的命運。
在租房的過程中,我們通常情況下,我們是不知道具體的房源的信息的,這時候都會通過一個中介來幫我們找到合適的房源,而我們也是最終通過中介這個角色來完成租房的一系列的事情。
像這種我們在完成一件事情的時候,需要通過中介來完成,而這個中介就類似一個代理的角色,這種情況在我們的程序中就叫做代理模式。
而這種現(xiàn)象其實在我們的生活中是比較多見的,比如:購買火車票不一定要去火車站買,可以通過12306 網(wǎng)站或者去火車票代售點買,或者第三方的代理機構(gòu),攜程、同城等。
再比如:找工作,通常都是在一些招聘網(wǎng)站,或者朋友內(nèi)推等方式。甚至現(xiàn)在找女朋友,都可以有中介來完成,這也是程序員的一大福音啊,簡直是造福人類啊,哈哈哈哈...我們再來看下官方的定義。
所謂代理模式就是給目標(biāo)對象提供一個代理對象,并由代理對象控制對目標(biāo)對象的引用,在我們上面的例子中目標(biāo)對象就是房源,代理對象就是中介。
既然"藝術(shù)來源于生活",本著存在即合理的人生哲學(xué),中介和代理模式的出現(xiàn)也一定有它的的意義;所以我們先來探討下代理模式的特點,我們先來說說他的優(yōu)點。
安全性
耦合性
擴展性
安全性
當(dāng)我們的客戶端去調(diào)用目標(biāo)對象的時候,就可以通過一個代理對象來完成,這樣就可以保護目標(biāo)對象的安全,避免很多的客戶端都去直接調(diào)用目標(biāo)對象。
耦合性
將客戶端對象和目標(biāo)對象分離開來,通過一個代理對象來完成相應(yīng)的功能,一定程度上是降低了系統(tǒng)之間的耦合性。
擴展性
通過展性雜性展目標(biāo)對象的功能,這個在我們學(xué)習(xí)框架的時候,就會經(jīng)常遇到,比如:Spring框架中的AOP其原理就是通過代理模式來完成的。
優(yōu)點說完了,夸也夸了,本著公平的原則,我們也的來說代理模式的缺點......
人類:什么?還有缺點,
上帝:當(dāng)然了,我不僅在造人的時候,造了男人和女人,在創(chuàng)造任何事物的時候,都給了優(yōu)點和缺點,所以你們?nèi)祟愂澜绮拍敲簇S富多彩。
人類:好了,你說吧;心想:世界上的那么多壞人原來都是你搞的鬼....
于是上帝開始了它的即興演講,話說代理模式的缺點,稍微比優(yōu)點少了一個,只有兩個而已,嘿嘿..
復(fù)雜性
性能
復(fù)雜性
本來客戶端可以直接和目標(biāo)對象建立關(guān)系,直接調(diào)用,非要加上一個代理對象,無疑是增加了系統(tǒng)的復(fù)雜性,多一事不如少一事。
性能
還是剛才說的,好端端的多出了有一個代理對象,系統(tǒng)在創(chuàng)建對象的時候,是不是就要多創(chuàng)建一個代理對象(這可真是摳啊)。
好了,到這里道理我們都了解了,接下來咱么就來看看,代理模式在代碼中是如何應(yīng)用的,下面咱么會通過一個小案例來加深對代理模式的理解。
接下來咱么就以一個大家都喜聞樂見的案例來演示下代理模式。
這個過程中總共需要兩個類和一個接口,一個是目標(biāo)對象,一個是代理對象,還有一個頂層的抽象接口。
首先,咱么先來抽象出一個頂層的接口,這是婚介所的抽象接口。
/** * 婚介所 */ public interface Matchmaking { // 撮合類,撮合單身男女的方法 public void Match(); } |
然后我們創(chuàng)建目標(biāo)對象,它就是程序猿,也就是真實對象,程序猿人生最大的目標(biāo)就是找到女朋友了。
/** * 程序猿--->真實的對象 */ public class ProgrammerReal implements Matchmaking { public void Match() { System.out.println("努力找女朋友中...."); } } |
最后還要創(chuàng)建代理對象,這個代理對象就是傳說中的婚介所,廣大程序猿的福音。
/** * 非誠勿擾婚介所--->代理對象 */ public class FeiChengWuRaoProxy implements Matchmaking { // 持有的真實對象 ProgrammerReal real = new ProgrammerReal(); public void Match() { // 擴展功能 System.out.println("程序猿沒有女朋友.........."); // 調(diào)用真是對象 real.Match(); // 擴展功能 System.out.println("程序猿找到了女朋友........哈哈哈"); } } |
到這里代碼就齊活了,最后為了驗證下我們的理論,還要進行下測試,上代碼。
/** * 代理模式測試 */ public class ProxyTest { public static void main(String[] args) { // 創(chuàng)建代理對象 FeiChengWuRaoProxy proxy = new FeiChengWuRaoProxy(); proxy.Match(); } } |
看結(jié)果,結(jié)果顯示,程序猿通過婚介所成功找到了女朋友,說明我的測試是沒問題。
同時通過上面的這個案例,也告訴大家婚介所是真的有用的,廣大程序猿們可以試一試,萬一實現(xiàn)了呢。