靜態代理模式的兩種理解方式

      在介紹靜態代理之前,大家先來了解下代理的含義。

  舉一個現實生活中的例子:歌星或者明星都有一個自己的經紀人,這個經紀人就是他們的代理人,當我們需要找明星表演時,不能直接找到該明星,只能是找明星的代理人。比如劉德華在現實生活中非常有名,會唱歌,會跳舞,會拍戲,劉德華在沒有出名之前,我們可以直接找他唱歌,跳舞,拍戲,劉德華出名之後,他乾的第一件事就是找一個經紀人,這個經紀人就是劉德華的代理人(代理),當我們需要找劉德華表演時,不能直接找到劉德華了(劉德華說,你找我代理人商談具體事宜吧!),只能是找劉德華的代理人,因此劉德華這個代理人存在的價值就是攔截我們對劉德華的直接訪問!
  這個現實中的例子和我們在開發中是一樣的,我們在開發中之所以要產生一個對象的代理對象,主要用於攔截對真實業務對象的訪問。那麼代理對象應該具有什麼方法呢?代理對象應該具有和目標對象相同的方法

  所以在這裏明確代理對象的兩個概念:
    1、代理對象存在的價值主要用於攔截對真實業務對象的訪問
    2、代理對象應該具有和目標對象(真實業務對象)相同的方法。劉德華(真實業務對象)會唱歌,會跳舞,會拍戲,我們現在不能直接找他唱歌,跳舞,拍戲了,只能找他的代理人(代理對象)唱歌,跳舞,拍戲,一個人要想成爲劉德華的代理人,那麼他必須具有和劉德華一樣的行爲(會唱歌,會跳舞,會拍戲),劉德華有什麼方法,他(代理人)就要有什麼方法,我們找劉德華的代理人唱歌,跳舞,拍戲,但是代理人不是真的懂得唱歌,跳舞,拍戲的,真正懂得唱歌,跳舞,拍戲的是劉德華,在現實中的例子就是我們要找劉德華唱歌,跳舞,拍戲,那麼只能先找他的經紀人,交錢給他的經紀人,然後經紀人再讓劉德華去唱歌,跳舞,拍戲。

靜態代理模式,簡單理解,就是一個類的對象的任務,自己不想處理,交給另外的一個類的對象去處理。

再舉一個生活中的例子,大家來體會一下。

 打一個最簡單的比方,我現在想要學習,那麼就必須得把書包拿過來,把書掏出來,準備好紙筆,然後開始學習,等學完了我還得收拾書,把書塞回書包裏,還得整理一下書包,這是一個完整的學習的過程,但是我很懶,不想動彈,只想學習,那可能就得讓媽媽幫我把書包拿過來,把書打開,我只管學習就好了,學完以後,媽媽再幫我把書整理好放回去.(我這是打個什麼破比方...),在這裏,媽媽就代表了一個代理對象,要學習的人是我,而我只管學習,這樣效率才最高,至於其他的交給代理對象(媽媽)做就好了,畫一個醜陋的的圖表示一下:

把這個圖抽象一下,就是靜態代理模式的類圖了。如下圖所示:

 

simple_proxy.png

通過這個例子大家有沒有發現一個問題:代理對象做的事情,反而比真實對象多了。

基於這點考慮,我們在實際編程過程中,很多時候,是通過寫某個對象的代理,來修改別人的代碼,這樣的話,就不用在別人的代碼基礎上進行修改,還可以用上前人寫的代碼。

細心的人會發現,上述的代理模式和現實生活中的是反着的。代理對象做的反而比真實對象多?這不符合常理吧?

我們在現實生活中要想做什麼事情,其中的一部分不想做了,可以代理給別人做。還是上邊的例子。媽媽不想學習,收拾好文具後,把學習交給我做,自己做其他的。那我纔是真正的代理對象。

回到編程上來說,比如一個類實現了處理單擊事件的接口,重寫了onclicked方法。可這個類不想自己處理,就把他代理給另外一個也實現了處理單擊事件的接口的類的對象去處理就好了。這纔是一種比較正常的代理邏輯。

但是,不管怎麼理解,正過來代理,或者反過來代理。代理的思想都是一樣的,大家也不必過分糾結誰主誰次的問題。

參考資料:

https://www.cnblogs.com/xdp-gacl/p/3971367.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章