2010-03-06 68 views

回答

1

你的意思是类似于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(); 
+0

好点。谢谢。我在想,如果某个节点会异步处理,则需要制作资源的副本。在我的情况下,它更复杂,资源将被包装在其他资源中。 – Benny 2010-03-06 11:30:20

1

谁通过资源的管调用者。它分配资源并开始处理,所以它应该清理它。

如果控件永远不会返回给调用者,可以在管道末端使用终结符(但该终结符不​​应该对其他任何事情负责)。

使一个管道对象负责听起来像一个反模式,因为它意味着更紧密的耦合,更难以维护。

1

这听起来好像你正在实施我所知道的Chain of Responsibility pattern或类似的东西。

在这种情况下,我建议释放资源,无论您何时启动链的工作,而不是将该责任委托给链中的其中一个处理器。

1

我建议你看看"Unit of Work"模式。

换句话说,使数据,对象和资源本身成为管道传递的单个对象的一部分。 使工作单元公开一个释放方法,该方法将负责回滚/释放/提交所有待处理的工作(可能区分是否由于Abend)。

这个发布方法将在流水线中的最后一步(如果一切顺利的话)或catch/finally中间步骤的一部分(如果某些事情中断)调用。

+0

这种方法的缺点是,您必须非常确定您链中的最后一个处理器调用release;并且链中没有其他东西叫释放。这将链中最后一个处理器与处理的工作单元紧密耦合在一起,意味着该处理器必须始终位于链的末端 - 您无法在不同的位置与该处理器建立另一条链。 – razlebe 2010-03-06 11:25:18

+0

嗯,是的。但我真的不明白这一点:资源不会自动释放自己,如果在流程结束之前强制释放它们,则会出现问题。 将资源打包到工作单元中可以缓解这一点,因为UoW方法可以检查资源是否已经被释放,并且在您试图再次释放资源时抛出异常,或者在调用之后调用方法该资源已被释放。 – 2010-03-06 11:37:24