在替考的代理模式中到底誰是Proxy?

B代替A參加考試,A是代理還是B是代理?

(ps:老師說真正做事的那個是realSubject,而另一個就是代理,那就是說A是代理。但是在《大話設計模式》這本書中,D代替C送花,D是代理,從一種角度說,花是C要送的,但是真正執行送花動作的是D)。


你可能誤解了proxydelegate的區別

subject -&> behavior &<-&> object

proxy
subject -&> behavior &<-&> proxy &<-&> object

delegate
subject -&> behavior &<-&> delegate &<-&> delegatee -&> object

proxy是一個簡單的pass through,它的工作是把subject的指令傳遞給object,proxy並不需要具備如何操作object的知識;

delegate是一個responsibility的轉移,它的工作是具體地做本來應該subject自己做的事,這個過程里,delegatee(代理人)需要具備關於object的知識。

替考模型是delegate而不是proxy,如果(只是假設)你手骨折不能自己答題,而自己讀題後通過手機發送給能代替你寫下答案的那個人,就是proxy了。

proxy翻譯成中文詞「代理」的語義,其實更接近於」中繼「。真正的「代理」的語義,其實用"委託「更準確。但是中文是一種模糊的語言。


謝邀!

這個問題確實有點搞,沒有看起來那麼簡單。

什麼是代理?

Proxy(代理,代理人,受託人)的含義:

- A person who has been given the authority to represent sb else.

來自 proxy - Wiktionary:

- An agent or substituteauthorized to act for another person.

- (software) An interface for a service, especially for one that is remote, resource-intensive, or otherwise difficult to use directly.

B 代替 A 做事,B 是真正做事的,當然 B 是代理了,B 是委託者 A 的代理(或受託人),所謂 A 打事務。A 怎麼可能是代理呢?A 明明是委託者嘛。誰是委託方,誰是受託方(代理),如此簡單的關係,一清二楚。

代理模式

Proxy(代理)模式可能是最簡單的設計模式之一,常見的標準圖如下:

Source: Proxy pattern

B代替A參加考試,A是代理還是B是代理(ps:老師說真正做事的那個是realSubject,而另一個就是代理,那就是說A是代理。)

首先,你老師說的沒錯,他正是按照上面代理模式的標準類圖說的。在標準的代理模式中,Proxy 確實就是除了 RealSubject 之外的另一個類,而且作為代理它主要起到轉發 Client 請求的作用(如圖中的 delegate 關聯)。在此模式中,Proxy 是一個身份代理,而非事務代理,因為它並不真正地執行 action。

然而,老師的這句話並不能讓我們得出結論說 A 是代理,因為在「B 代替 A 參加考試」這種替考方式中,A 根本就不在考試現場,也就談不上在考試這個活動中,A 可以作為 B 的代理了。事實上,槍手 B 才是考生 A 的代理,在考試中,他不但是一個身份代理(假冒原考生的身份),而且還是一個事務代理(代替原考生完成全部的考試)。

「特殊」的代理模式

參考上圖,「B 代替 A 參加考試」這種替考模式的一個特殊之處在於,考試時似乎沒有 RealSubject,因為考生並不在現場參加考試,而槍手(Proxy)不是僅僅轉發任務,而是直接在現場替考生完成了考試(真正做事)。這還是代理模式嗎?

是的,這是一種特殊的代理模式,類似於短路,見下圖。

由於 Proxy 完全代替了 RealSubject 來接受 Client 方的請求,相當於一個全權代理,做多少事其實是由 Proxy 來決定的,它既可以不做任何處理全部轉發請求,也可以只做少量的前處理和後處理而讓 RealSubject 來執行真正的 action,甚至還可以做全部的事(如上圖的替考方式一),做多做少並不影響這個結構和運行機制的本質。

如果 Proxy 做了全部的事,RealSubject(考生)就不必存在或參與到這個活動中,它是多餘的,但這還是一個 Proxy 模式,相當於一種極端情況(短路的代理模式)。在這種替考方式下,不管做多少事,前面的槍手總是後面考生的代理。

有一種說法是代理只提供身份,而不真正做事

沒錯,常規的代理模式是這樣的,代理通常只是轉發請求,不真正做事。但代理也不是一點事都不做,通常可以做一些預處理和後處理,相當於輔助性工作,正事還是由 RealSubject 來完成。Wikipedia 上的介紹:

  • A proxy may hide information about the real object to the client.
  • A proxy may perform optimization like on demand loading.
  • A proxy may do additional house-keeping job like audit tasks.

另外兩種替考方式

我再舉一個更像代理模式的替考例子。

在以上的替考方式二中,現場槍手(替考者)並不是自己獨立完成考試,而是時不時地以無線作弊方式把試題發給遠程的槍手來解答。在這種情況下,現場槍手無疑是遠程槍手的一個考試 Proxy(代表遠程槍手和原考生出現在考試現場),而真正的答卷(做事)是由遠程槍手來完成的,這是很標準的代理模式,沒問題吧。

此代理非彼代理

。。。


記住一點: 跟客戶直接打交道的就是代理。

你這本書舉例子舉得不太好。


瀉藥。其實這個問題有點繞,我首先明確下答案:B是代理。

本來是A的考試,實際去答題的卻是B。但是最終B去答題只有A知道,對於監考老師來說,他只知道是A參加考試,而不知道答題的是B。老師那裡得到的結果也是A參加了考試,B對於監考老師來說是透明的,只有A知道最終答題的是B。


舉個例子,代理其實就是個包工頭,客戶的所有要求都和包工頭溝通,包工頭會協調下面幹事的小工們,你幹啥,他幹啥,最後把結果交給用戶,對客戶來說,包工頭是小工們的代理,他需要關心的是業務上的事


推薦閱讀:

怎樣才能在寫代碼時沒有一種「如履薄冰」的感覺?
用 C++ 編程時,如果不使用設計模式,多層封裝,採用複雜的數據結構,代碼更直觀,易理解,引入(設計模式)後雖然做到了高度的解耦。但是代碼邏輯複雜了,怎麼平衡好?
有哪些在實際 Android 項目中用到的設計模式?
Android 開發中常用到的設計模式有哪些?
最上層的語言和最底層的語言都無需設計模式?

TAG:編程 | UML建模 | 設計模式 |