我正在阅读其中一篇关于代理模式的文章。
Read the Comments After the Explanation
在本文中,代理模式提到了一些缺点,但我无法理解:
1)
这里的缺点是魔法'可能会发生一个扩展器没有意识到(一个黑盒子问题)。 请解释一下魔法。
2)
代理可以从其客户端屏蔽易失性资源的生命周期和状态。客户端可能会调用代理没有意识到资源当前不可用...在这种情况下,代理必须阻塞,直到资源再次可用,或者它必须产生某种错误。在Java术语中,它必须是未经检查的异常,因为Proxy必须符合原始对象的接口。此外,客户端可能不知道它现在调用的资源与它之前调用的资源不同;如果资源上有任何状态,那么客户可能会对该状态似乎已被遗忘感到困惑。
请解释。
3)
如果代理用于表示本地进程中的远程资源,则可以掩盖涉及远程通信的事实。我们知道,远程调用与本地调用完全不同,我们的程序不应该将它视为相同。如果代理以某种方式声明它是远程资源的代理而不是本地资源,则会更好。然后,客户端将能够仅选择本地资源,或在使用远程资源时修改其行为。
请您帮助我理解上述有关代理缺点的三点吗?
答案 0 :(得分:1)
这提出了3个不同的问题。我会回答第三个问题。你最好把你的问题编辑成一个问题,然后在一个单独的问题中询问其他问题。
在处理与远程服务器的通信时,通常使用代理模式(例如,通过RMI)。你从一些工厂得到一个对象的引用,你得到的实际上是一个存根(一个代理),对于你调用的每个方法,它都会对方法的参数进行序列化,将它们发送到服务器,等待响应,并返回结果。 代理使这几乎透明,但没有意识到所有这些发生在幕后可能会使你的代码效率非常低。
以此示例为例:
if (account.getBalance() > 0 && account.getBalance() < MAX) {
transferAmount(account.getBalance() / 2);
}
现在假设account
是远程对象的代理。每次调用getBalance()
时,都会进行远程网络调用,这可能会导致异常,甚至每次都返回一个不同的值,从而使这个简单的代码段效率极低。