我实现了一个管道模式,资源被传递给一系列将处理资源的对象,当一个对象完成使用资源后,它将它传递给后继者,所以何时以及哪个对象释放资源?如何在资源传递到一系列对象时释放资源?
回答
你的意思是类似于chain of responsability模式(或一个变体)?如果是的话,我想最后的处理对象可以释放资源:
public void process(Resource rsrc)
{
writeMessage(msg);
if (next != null)
{
next.process(rsrc);
}
else
{
// release resource
}
}
但是你的问题是,我不太清楚,所以我不知道我究竟回答了你的问题。
编辑
我假定你有一些相当复杂的情况和您的管道并没有一个简单的方法(例如,如果它是异步的)返回。但正如在其他的答案的建议,如果你能创建资源,防火责任链,然后释放资源,这当然是最简单的方法:
Resource rsrc = new Resource();
chain.process(rsrc);
rsrc.release();
谁通过资源的管调用者。它分配资源并开始处理,所以它应该清理它。
如果控件永远不会返回给调用者,可以在管道末端使用终结符(但该终结符不应该对其他任何事情负责)。
使一个管道对象负责听起来像一个反模式,因为它意味着更紧密的耦合,更难以维护。
这听起来好像你正在实施我所知道的Chain of Responsibility pattern或类似的东西。
在这种情况下,我建议释放资源,无论您何时启动链的工作,而不是将该责任委托给链中的其中一个处理器。
我建议你看看"Unit of Work"模式。
换句话说,使数据,对象和资源本身成为管道传递的单个对象的一部分。 使工作单元公开一个释放方法,该方法将负责回滚/释放/提交所有待处理的工作(可能区分是否由于Abend)。
这个发布方法将在流水线中的最后一步(如果一切顺利的话)或catch/finally中间步骤的一部分(如果某些事情中断)调用。
这种方法的缺点是,您必须非常确定您链中的最后一个处理器调用release;并且链中没有其他东西叫释放。这将链中最后一个处理器与处理的工作单元紧密耦合在一起,意味着该处理器必须始终位于链的末端 - 您无法在不同的位置与该处理器建立另一条链。 – razlebe 2010-03-06 11:25:18
嗯,是的。但我真的不明白这一点:资源不会自动释放自己,如果在流程结束之前强制释放它们,则会出现问题。 将资源打包到工作单元中可以缓解这一点,因为UoW方法可以检查资源是否已经被释放,并且在您试图再次释放资源时抛出异常,或者在调用之后调用方法该资源已被释放。 – 2010-03-06 11:37:24
- 1. REST:如何在创建新资源时传递相关资源?
- 2. 关机时释放资源
- 3. Php资源释放
- 4. SFML释放资源
- 5. 在进程终止时释放资源
- 6. 在NSRunLoop结束时释放资源
- 7. 数据库从控制器传递对象时,到资源库
- 8. ActiveXObject - Excel.Application不释放资源
- 9. Log4Net不释放资源
- 10. 释放OpenSSL的资源:SSL_CTX_free
- 11. PHP/DOMDocument:unset()不释放资源
- 12. 当Android资源被释放?
- 13. Java文件释放资源
- 14. AVAudioUnitSampler未释放资源
- 15. 如何释放进程的资源
- 16. 如何释放HttpPostedFileBase使用的资源?
- 17. 如何正确释放GDI资源?
- 18. 找不到资源对象
- 19. 停止调试时释放资源
- 20. 做server.transfer时,响应对象是否传递给接收资源?
- 21. Javascript自动释放资源(如RAII)
- 22. 在Windows和unix中释放资源
- 23. 如何在aws lambda超时释放resdhift资源?
- 24. 如何获取链接到耶拿资源的资源列表?
- 25. C# - 释放对象使用的所有资源
- 26. X11资源释放(特别是Screen对象)
- 27. 资源$ NotFoundException存在资源时
- 28. 如何以及何时释放指针中的资源
- 29. 资源与资源
- 30. memcaching PHP的资源对象
好点。谢谢。我在想,如果某个节点会异步处理,则需要制作资源的副本。在我的情况下,它更复杂,资源将被包装在其他资源中。 – Benny 2010-03-06 11:30:20