代理(Proxy)模式 vs. 代理(Agency)機構

有一天,我將設計模式中的代理模式和咱們社會中的代理機構聯繫起來。發現他們之間有很是多的類似的地方,並且能夠互相借鑑。設計模式

在討論這個話題以前,個人老闆就率先指出了個人缺點。代理是Proxy不是Agency。Proxy通常指協議,和生活中的代理機構Agent是不同的哦。不過我想說的是,因此咱們才應該感嘆中國漢語之博大精深,以及設計模式翻譯的如何巧妙了。瀏覽器

對比並不必定是一件快樂的事,可是對比和討論每每能夠幫助咱們加深對原有思想的理解。緩存

社會中的代理機構

咱們先來講說咱們生活中的代理。咱們何時纔會遇到代理呢?好比租房代理/商標註冊代理/法律代理等等。這和理解設計模式同樣,須要先看看模式的目的,也就是代理這種社會現象存在的價值所在了。ide

就好比說貸款,特別是住房公積金貸款,這項任務,既複雜,也好時間,簡單點說就是麻煩。因此這項工做對應的代理就有了成長的土壤。他們幫助咱們完成這件事,條件是從中抽取一部分佣金。優化

可見社會中的代理模式是這樣的。翻譯

你--〉代理--〉辦事機構設計

而且咱們能夠注意到一個現象,辦同一件事的代理並非只有一家,並且就算一家,也不止有一個代理人員。可是行業只要足夠成熟,他們對你的辦事方式方法都是統一的,因此你關心的不是那個代理能不能辦成事,而是用這個代理的成本高不高。固然了,若是要考慮欺詐行爲,那麼成本就更高了。另外,一個代理能夠爲不一樣人進行代理,這點是最重要的,正是由於有這個緣由,才讓代理機構能夠營利。代理

設計模式中的代理模式

好了,介紹完了以後,咱們再看看設計模式中介紹的代理模式。爲了忠實他的牙原有思想,我採用設計模式中的介紹方式來講明代理模式。對象

PROXY模式在《設計模式-可複用面向對象軟件的基礎》中歸類爲結構型模型。如下是引用自此書的中文翻譯版。圖片

  1. 意圖:爲其餘對象提供一種代理以控制對這個對象的訪問。
  2. 動機:對一個對象進行訪問控制的一個緣由是爲了只有在咱們確實須要這個對象時纔對它進行建立和初始化。...問題的解決分方案時使用另外一個對象,...,替代那個真正的...
  3. 結構:...運行時刻的一種可能的代理結構的對象圖。aClient->aProxy->aRealSubject
  4. 效果:一種優化方式:copy-on-write

補充一下,Windows系統中,瀏覽器中的預覽圖片,也能夠當作是一種代理模式,這樣能夠減小對實際圖片裝載的開銷。

對比

意圖對比:顯然兩方面都是同樣的,社會中的代理結構,就是爲了爲客戶提供一種代理。有一個頗有意思的細節,若是咱們仔細考慮一下,就會發現,咱們之前在考慮代理模式的時候,通常是從總體考慮的,並無足夠考慮模式中每個對象的細節需求。能夠說,咱們理想中的對象都是隻有付出,沒有賺取的。品格都是比較高尚的。但在社會中,每個對象都是由本身的利益所在的。雖不能說無利而不往,可是不少存在的現象,都是由於相互有利可圖。

動機對比:設計模式中對動機的描述,有點太晦澀了。這裏面咱們會發現不少有意思的問題。我相信這在咱們理解這俄模式的時候,也常常在困擾咱們。

一個典型的問題是:誰代理誰?代理是代理被訪問的對象,仍是代理客戶對象?在現實社會中,每每是客戶對象認爲本身去作的成本過高,因此僱傭代理機構去完成。但在設計模式中,咱們看到調用方向和社會模式中的方向不同。這一點很是奇怪。我也是理解了好久,和你們又討論了一番,才感受比較理解這個差別了。

形成這個問題的緣由是由於我剛纔提到的。咱們在討論純軟件設計的時候,可能會忽略動機是系統的需求仍是個體的需求。現實生活中,通常都是個體需求,理論中通常都是系統需求。雖然不能說誰對誰錯,能夠確定的是,關鍵在於從誰的角度去考慮這個問題,或者是誰來解決問題。

這點若是用咱們現實生活中的話更容易理解。不少時候,不在於事情誰來作最合適,而在於誰作了。若是老是在幾個「應該」作的部門之間互相踢皮球,受傷的是整個社會!因此在系統設計中,關鍵在於解決這個問題,至於這個解決問題的能力歸屬於誰,我認爲不是過重要。固然了,若是考慮了更好!

結構對比:這點在說動機對比的時候,其實已經涉及到了。關鍵在於方向恰好相反!無論怎麼樣,代理的地位是同樣的。

效果對比:這個對比其實有點無聊。不過能夠看出系統和社會同樣,當訪問一個對象成本較高的時候,緩存的機制就會提出。Delphi語言中String的copy-on-write技術實現,瀏覽器中的Cach技術。這些咱們之前能夠認爲是叫緩存技術的,不嚴格的話,都和代理模式效果一致。

語言對比:Proxy和Agent。我我的認爲Proxy來命名模式,容易讓人誤解,還不如叫Agent模式。這樣更容易讓人理解。至少不少英語不是很強的中國人對Proxy的理解容易出誤差。另外,此模式的結構和現實生活也有所差別,這點也讓不少人容易誤解。

借用

再來看看咱們社會模式中代理結構。假象咱們做爲一個客戶,當你要僱傭代理機構的時候,每每是由於某些事情比較複雜。而一旦你將事情委託出去了。你就會很天然地說這樣的話:「那好,大家就作吧,有什麼事情再找我」。因而你就開始忙本身的事情去了。從這一點看,代理有可讓事情並行處理的好處。

回到Proxy模式,我建議,能夠擴展這樣的模式,在原有模式上,增長並行處理的流程。Proxy能夠在某些方法執行以後,通知Client繼續處理。不然,Client能夠繼續作其它事情。

擴展開來。之後若是咱們的系統都在並行模式中開發的話,奠基一些基於並行的模式,對咱們軟件工程的發展很是有利。

總結

 這個對比,並非無聊之極的聯想,事實上,我本人就從上面對原有的模式有了更深的理解。這個就是代碼大全裏面曾經提到的「隱喻」的概念。我所想表達的不光是相同的,更重要的是那些不一樣的地方,比較相同點可讓咱們認識更清晰,而比較不一樣點,可讓咱們學到更多!

相關文章
相關標籤/搜索