2013-08-18 44 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

我相信这个解释也或多或少涵盖了第一种情况。你可以说透明地进行远程调用可以被认为是“魔术发生” –