0

我正在浏览一篇关于代理模式的文章。

解释后阅读评论

在这篇文章中提到了代理模式的一些缺点,但我无法理解:

1)这里的缺点是扩展器没有意识到的“魔术”可能正在发生(“黑盒”问题)。请解释一下魔法

2)代理可以从其客户端掩盖易失性资源的生命周期和状态。客户端可能在没有意识到资源当前不可用的情况下调用代理......在这种情况下,代理必须阻塞直到资源再次可用,或者它必须产生某种错误。在 Java 术语中,它必须是一个未经检查的异常,因为代理必须符合原始对象的接口。此外,客户端可能不知道它现在调用的资源与它一秒钟前调用的资源不同;如果资源上有任何状态,则客户端可能会混淆该状态似乎已被遗忘。

请解释。

3)如果使用代理来表示本地进程中的远程资源,这可能会掩盖涉及远程通信的事实。正如我们所知,远程调用与本地调用完全不同,我们的程序不应该将其视为相同。如果代理以某种方式声明它是远程资源的代理,而不是本地资源,那就更好了。然后客户端将能够只选择本地资源,或者在使用远程资源时修改它们的行为。

请您帮助我理解上述与 Proxy 缺点相关的三点吗?

4

1 回答 1

1

这提出了3个不同的问题。我会回答第三个。您最好将您的问题编辑为一个问题,并在单独的问题中分别询问其他两个问题。

在处理与远程服务器的通信时,经常使用代理模式(例如,通过 RMI)。您从某个工厂获得对对象的引用,而您获得的实际上是一个存根(代理),对于您调用的每个方法,它都会对方法的参数进行序列化,将它们发送到服务器,等待响应,并返回结果。代理使这几乎透明,但不知道所有这些都发生在幕后会使您的代码效率非常低。

以这个例子为例:

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

现在想象这account是一个远程对象的代理。每次getBalance()调用都会进行远程网络调用,这可能会导致异常,甚至每次都返回不同的值,使得这个简单的代码片段效率极低。

于 2013-08-18T20:57:21.187 回答