2010-03-06 65 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