我們已經看到Command pattern是如何在以前的項目中,我能理解它如何能在多線程(並行)編程有用的,因爲命令可以在不同的線程執行。當需要在命令之間傳遞數據時,數據可以存儲在共享內存中,並且可以將數據的指針(或句柄)傳遞給不同線程上的調用者。要使用多線程,Command模式比Decorator模式更有用嗎?
然而,Decorator模式似乎有一切必須發生在單個線程,因爲裝飾有直接調用該委託,這意味着它們必須在同一線程上的限制。
我對此限制的理解是否正確?相反,是否有可能在多線程上運行裝飾器?
我想實現的是一個處理數據流的管道。
- 爲了實現如命令模式,其
execute
方法將需要兩個參數:用於輸入的緩衝器和用於輸出的緩衝器。 - 實現,因爲Decorator模式,其
getdata
方法將調用其委託拿到上一步的結果,應用自己的處理,並把結果返回給調用者。
然而,在我已經在兩種樣式中實現它之後,我發現每個都有我原來不清楚的限制。
- 當使用命令模式,我可以開始使用一個新的緩衝區接受更多的輸入數據,而較早的緩衝器正在由在獨立的工作線程中運行某些命令處理。我似乎無法用Decorator模式做到這一點。
- 當使用Decorator模式,裝飾可以使任何數量的調用其委託的,並能夠將結果合併成一個大塊。它也可以分割數據,做出一個大的請求,緩存它,然後返回它的一部分。當我用一個輸入緩衝區和一個輸出緩衝區使用Command模式時,不能有任何組合或分裂結果。
呵呵。我無法看到裝飾器和線程之間的連接。這些都是我認爲的正交概念。如何「調用」或「執行」裝飾器?裝飾器是['動態添加行爲到現有對象的方法]](http://en.wikipedia.org/wiki/Decorator_pattern) – sehe 2011-05-21 22:51:11
通過將對象包裝到同步方法中,裝飾器可用於使任何類線程安全。在任何情況下,模式的有用性都是主題過於主觀而無法在這裏得到答案。 – ilcavero 2011-05-21 22:56:54
@sehe:有一些框架,其中大部分處理是由裝飾器執行的,通過對從其代理返回的數據執行附加處理。我知道裝飾器(最初描述的)應該是輕量級的(它們爲用戶提供了一個很好的語法),所以也許重量級的裝飾器不應該是一個裝飾器的調用者? – rwong 2011-05-21 23:04:16