2012-07-09 65 views
1

代理 - 哪些代码(以及哪里)将ProxyService转换为RealService调用?为什么/何时使用这个? 图层 - 如何实现? 纪念品 - 为什么不把状态持久化到缓存或文件?代理和记忆模式

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

  • 我想不出一个简单的例子,当我将有机会获得ServiceProxyService,但不RealService - 有人可以提供范例何时这可能发生吗?

这与Memento图案有何不同?我对Memento定义的理解是,它用于保存一个对象状态,这是代理真正在做的事情,是的?如果没有,请解释Memento与代理服务器的不同之处!提前致谢!

回答

2

首先,我会告诉我的答案是,我不相信有任何关于模式的硬性规定 - 你从他们那里拿走你所需要的东西,除此之外别无他途。我使用某些模式的方式无疑与其他开发人员选择使用它们的方式不同。这就是说,这是我对你的问题的看法。

代理模式解释

我知道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。你可以使用代理模拟很多静态语言的“动态语言”功能。您也可以使用代理来评估一段代码,该代理实际记录每次创建的调用,并且每次都返回新的代理,通过执行它来重建“原始源代码”。

纪念图案:完全是另一回事。当你想要使用一个对象时,你可以使用它,保存它当前的状态,用这个对象来计数,然后过一段时间你可能想要选择回滚到前一个状态。你可以用它来实现你的对象中的事务行为,当通过代码撤销事情是困难的。您可以使用此功能实现撤消&重做功能。 (而不是保存改变三角洲,你保存完整的状态)。您可以在模拟中使用它,以便每次从同一点开始(可以说源版本服务器每隔一段时间使用一次记忆[它们通常使用记忆+增量变化的组合])。虚拟机的快照或计算机的休眠也是使用备忘录模式。并保存一些东西的状态,所以你可以再现完全相同的情况也是纪念。