在替考的代理模式中到底誰是Proxy?
B代替A參加考試,A是代理還是B是代理?
(ps:老師說真正做事的那個是realSubject,而另一個就是代理,那就是說A是代理。但是在《大話設計模式》這本書中,D代替C送花,D是代理,從一種角度說,花是C要送的,但是真正執行送花動作的是D)。
你可能誤解了proxy和delegate的區別
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 明明是委託者嘛。誰是委託方,誰是受託方(代理),如此簡單的關係,一清二楚。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)不是僅僅轉發任務,而是直接在現場替考生完成了考試(真正做事)。這還是代理模式嗎?是的,這是一種特殊的代理模式,類似於短路,見下圖。沒錯,常規的代理模式是這樣的,代理通常只是轉發請求,不真正做事。但代理也不是一點事都不做,通常可以做一些預處理和後處理,相當於輔助性工作,正事還是由 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 開發中常用到的設計模式有哪些?
※最上層的語言和最底層的語言都無需設計模式?