首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >代理和Memento模式

代理和Memento模式
EN

Stack Overflow用户
提问于 2012-07-09 22:47:21
回答 2查看 939关注 0票数 1

代理--哪些代码(以及在哪里)将ProxyService转换为RealService调用?为什么/什么时候使用这个?层-如何实现?备忘录-为什么不只是将状态持久化到缓存或文件?

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

  • 当我能够访问ServiceProxyService而不是RealService时,我想不出一个例子--有人能给出什么时候会发生这种情况的例子吗?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-09 23:12:46

首先,我要解释一下我的回答,我不相信关于模式有任何硬性的规则--你从他们那里拿走你需要的东西,没有别的了。我使用某些模式的方式无疑不同于其他开发人员选择使用它们的方式。话虽如此,这是我对你问题的看法。

代理模式解释了

根据我对Proxy设计模式的了解,您可以使用它做两件事:

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

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

为了进一步阅读,本文提供了很多好的信息:

模式/代理

与Memento模式的区别

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

因此,希望这能有所帮助--我喜欢把Memento看作是一个功能更全面的Proxy版本,但并不是所有的Proxy实现都是Mementos

票数 2
EN

Stack Overflow用户

发布于 2012-07-09 23:12:39

代理是当某人期待某个物体,你对他撒谎,你说:是的,在这里你有你的目标,但是你实际上是在给他其他的东西.代理的常见用途:实现延迟初始化:您需要一个对象来表示一个大文件的内容,或者是一些非常昂贵的东西,您知道在这个时候不需要它,或者它实际上可能永远不会被真正使用。因此,您将传递一个代理,该代理只能在资源100%完全必要时获得(您也可以开始获取资源,这与时代不符,并且使用代理的进程只能在它真正需要资源时才开始等待)。这在ORMs中很常见。另外,期货与承诺实现了这样的方法来拦截调用:您可以传递一个真正知道真实对象的代理,并拦截它得到的调用,并做一些有趣的事情,比如记录它们,更改其中的一些,等等.代理还有很多高级而复杂的用法,因为您通常能够在运行时确定行为。很抱歉离开了Java,但是在C#中,城堡代理被用来实现模拟对象进行测试。您还可以使用代理实现诸如下划线链接之类的东西。您可以使用代理在静态语言中模拟许多“动态语言”特性。您还可以使用代理来评估一段代码,该代理实际上记录了每个调用,每次都返回新的代理,只需执行它就可以重建“原始源代码”。

记忆模式:完全是另一回事。当您想使用一个对象时,您可以使用它,保存它的当前状态,计算使用该对象进行细化,过一段时间,您可能希望选择回滚到以前的状态。您可以使用它在您的对象中实现事务性行为,而通过代码取消这些操作是很困难的。您可以使用此方法实现撤消和重做功能。(不是保存change,而是保存完整的状态)。您可以在模拟中使用它,以便每次从同一点开始(您可以说,每隔一段时间使用memento,它们通常使用memento +增量更改的组合)。虚拟机的快照或计算机的hibernate也是记忆模式的一种使用。保存某物的状态,这样你就可以复制完全相同的情况,这也是纪念品。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11404327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档