我實現了一個管道模式,資源被傳遞給一系列將處理資源的對象,當一個對象完成使用資源後,它將它傳遞給後繼者,所以何時以及哪個對象釋放資源?如何在資源傳遞到一系列對象時釋放資源?
回答
你的意思是類似於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. 如何釋放資源?
- 2. IDE如何釋放資源?
- 3. REST:如何在創建新資源時傳遞相關資源?
- 4. 關機時釋放資源
- 5. SFML釋放資源
- 6. Php資源釋放
- 7. 在C#中釋放資源
- 8. JNI:我應該何時釋放資源?
- 9. 在進程終止時釋放資源
- 10. 在NSRunLoop結束時釋放資源
- 11. 數據庫從控制器傳遞對象時,到資源庫
- 12. Java文件釋放資源
- 13. 當Android資源被釋放?
- 14. PHP/DOMDocument:unset()不釋放資源
- 15. 釋放OpenSSL的資源:SSL_CTX_free
- 16. Log4Net不釋放資源
- 17. AVAudioUnitSampler未釋放資源
- 18. ActiveXObject - Excel.Application不釋放資源
- 19. 如何防止NSWindow釋放資源?
- 20. 如何釋放HttpPostedFileBase使用的資源?
- 21. 如何釋放進程的資源
- 22. 如何釋放Spring bean中的資源?
- 23. 如何強制釋放資源?
- 24. 如何正確釋放GDI資源?
- 25. 找不到資源對象
- 26. 停止調試時釋放資源
- 27. 傳遞XML資源的XMLReader
- 28. Javascript自動釋放資源(如RAII)
- 29. 在Windows和unix中釋放資源
- 30. 如何在aws lambda超時釋放resdhift資源?
好點。謝謝。我在想,如果某個節點會異步處理,則需要製作資源的副本。在我的情況下,它更復雜,資源將被包裝在其他資源中。 – Benny 2010-03-06 11:30:20