【问题标题】:Proxy & Memento Patterns代理和备忘录模式
【发布时间】:2012-07-09 09:34:36
【问题描述】:

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

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

  • 我想不出一个可以访问ServiceProxyService 但不能访问RealService 的示例 - 有人可以提供有关何时会发生这种情况的示例吗?

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

【问题讨论】:

    标签: java design-patterns proxy-pattern memento


    【解决方案1】:

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

    代理模式解释

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

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

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

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

    http://sourcemaking.com/design_patterns/proxy

    与备忘录模式的区别

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2013-12-20
        • 2020-07-05
        • 2013-08-27
        • 2013-12-01
        • 1970-01-01
        • 2017-06-28
        • 2021-01-22
        • 2012-12-14
        • 2014-07-22
        相关资源
        最近更新 更多