2013-08-18 42 views
0

我正在瀏覽代理模式上的一篇文章。代理設計模式:缺點

Read the Comments After the Explanation

在這篇文章中有對代理模式提到的一些缺點,但我無法理解:

1)缺點這裏是「魔力」可能會發生,一個增量是不知道的('黑盒子'問題)。 請解釋魔術

2)代理可以掩蓋來自其客戶端的易失性資源的生命週期和狀態。客戶端可能會調用代理服務器沒有意識到資源當前不可用......在這種情況下,代理服務器必須阻塞,直到資源再次可用,或者它必須產生某種錯誤。用Java術語來說,它必須是一個未經檢查的例外,因爲代理必須遵守原始對象的接口。此外,客戶端可能不知道它現在正在調用的資源與第二個之前調用的資源不同;如果資源上有任何狀態,則客戶可能會疑惑該狀態似乎已被遺忘。

請解釋。

3)如果在本地進程中使用代理來表示遠程資源,這可能掩蓋了涉及遠程通信的事實。正如我們所知,遠程調用與本地調用完全不同,我們的程序不應該把它看作是相同的。如果代理以某種方式聲明它是遠程資源的代理而不是本地資源,那更好。然後,客戶端將只能選擇本地資源,或者在使用遠程資源時修改其行爲。

請您幫我理解以上三點與Proxy的缺點有關嗎?

回答

1

這使得3個不同的問題。我會回答第三個問題。你最好把你的問題編輯成單個問題,並在另外一個問題中詢問另外兩個問題。

在處理與遠程服務器的通信時,通常使用代理模式(例如由RMI)。你從一個工廠得到一個對象的引用,而你得到的實際上是一個存根(代理),對於你調用的每一個方法,它都將方法的參數串聯起來,發送給服務器,等待響應,並返回結果。 這個代理使得它幾乎是透明的,但並沒有意識到所有這些都發生在幕後,這會讓你的代碼效率非常低下。

拿這個例子,例如:

if (account.getBalance() > 0 && account.getBalance() < MAX) { 
    transferAmount(account.getBalance()/2); 
} 

現在想象account是代理遠程對象。每次調用getBalance()時,都會發出遠程網絡調用,這可能會導致發生異常,甚至每次都會返回不同的值,從而使此簡單代碼片段效率極低。

+0

我相信這個解釋也或多或少涵蓋了第一種情況。你可以說透明地進行遠程調用可以被認爲是「魔術發生」 –