1

代理 - 什么代码(以及在哪里)将 ProxyService 转换为 RealService 调用?为什么/何时使用这个?层——如何实现?纪念品 - 为什么不将状态保存到缓存或文件中?

我对代理模式的理解是你有某种Service接口,它有ProxyService具体RealService的东西。由于某种原因,您无法访问RealService, 因此您针对ProxyService实例进行编码,然后让框架将代理链接到您的服务的真实实例。只有两个问题:

  • 当我可以访问Serviceand时,我想不出一个例子ProxyService,但不是RealService- 有人可以提供关于何时发生这种情况的例子吗?

这与Memento模式有何不同?我对 Memento 定义的理解是,它用于保存对象状态,这是 Proxy 真正在做的事情,是吗?如果不是,请解释 Memento 与 Proxy 有何不同!提前致谢!

4

2 回答 2

2

代理是当某人期待某个对象时,你对他撒谎,然后说:是的,你有你的对象,但实际上你给了他别的东西……代理的常见用途:实现延迟初始化:你被要求提供一个代表大文件内容的对象,或者获取非常昂贵的东西,并且您知道此时不需要它,或者实际上可能永远不会真正使用它。因此,您传递了一个代理,该代理仅在 100% 完全必要时才获取资源(您也可以不合时宜地开始获取资源,并使使用代理的进程仅在它真正需要时才开始等待)。这在 ORM 中很常见。还有期货和承诺实现这样的东西来拦截调用:你可以传递一个实际上知道真实对象的代理,并拦截它得到的调用,并做一些有趣的事情,比如记录它们,改变它们中的一些等等......还有很多代理的高级和复杂用法,因为您通常能够确定运行时的行为。很抱歉退出 Java,但在 C# 中,Castle Proxy 用于实现模拟对象以进行测试。您还可以使用代理来实现,例如在下划线中链接. 您可以使用代理在静态语言中模拟许多“动态语言”功能。您还可以使用代理评估一段代码,该代理实际记录每次调用,并每次返回新代理,通过执行它来重建“原始源代码”。

纪念品模式:完全是另一回事。当您想使用一个对象时,您可以使用它,保存它的当前状态,计算对那个对象的细化,一段时间后您可能想要选择回滚到之前的状态。当很难通过代码撤消事物时,您可以使用它在对象中实现事务行为。您可以使用它来实现撤消和重做功能。(不是保存更改增量,而是保存完整状态)。您可以在模拟中使用它来每次从同一点开始(您可以说源版本服务器每隔一段时间使用一次备忘录[他们通常使用备忘录+增量更改的组合])。虚拟机的快照或计算机的休眠也是对 memento 模式的使用。并保存某物的状态,

于 2012-07-09T23:12:39.417 回答
2

首先,我要警告我的回答,我不相信关于模式有任何硬性规定——你可以从它们那里得到你需要的东西,仅此而已。我使用某些模式的方式无疑与其他开发人员可能选择使用它们的方式不同。也就是说,这是我对你的问题的看法。

代理模式解释

我知道Proxy设计模式的方式,你用它来做两件事:

  1. 限制对特定对象实例的其他公共方法的访问
  2. 通过在第一次调用代理时实例化具体对象,然后将代理上的所有进一步调用传递给您的代理创建的具体实例,防止其他昂贵且不必要的实例化成本。

也许RealService有一个doSomethingReallyDangerous()你想隐藏的方法。或者甚至更无害,可能有数百个方法,您每次在实例的变量名之后RealService键入时都不需要查看这些方法。您可以为此使用代理。.RealService

为了进一步阅读,这篇文章有很多很好的信息:

http://sourcemaking.com/design_patterns/proxy

与备忘录模式的区别

Memento模式允许您通过在具体对象旁边存储中间状态来将对象回滚到其原始状态或某个先前状态。有点像编程的“撤消”。您可能会使用一种Proxy模式来实现Memento,但Proxy不能保证保存对象状态或回滚 - 如果再次实例化该对象过于昂贵,它只会让您引用同一个对象进行方法调用。

所以希望这会有所帮助——我喜欢将其Memento视为功能更全面的版本Proxy,但并非所有Proxy实现都是Mementos.

于 2012-07-09T23:12:46.427 回答