1

我們已經看到Command pattern是如何在以前的項目中,我能理解它如何能在多線程(並行)編程有用的,因爲命令可以在不同的線程執行。當需要在命令之間傳遞數據時,數據可以存儲在共享內存中,並且可以將數據的指針(或句柄)傳遞給不同線程上的調用者。要使用多線程,Command模式比Decorator模式更有用嗎?

然而,Decorator模式似乎有一切必須發生在單個線程,因爲裝飾有直接調用該委託,這意味着它們必須在同一線程上的限制。

我對此限制的理解是否正確?相反,是否有可能在多線程上運行裝飾器?


我想實現的是一個處理數據流的管道。

  • 爲了實現如命令模式,其execute方法將需要兩個參數:用於輸入的緩衝器和用於輸出的緩衝器。
  • 實現,因爲Decorator模式,其getdata方法將調用其委託拿到上一步的結果,應用自己的處理,並把結果返回給調用者。

然而,在我已經在兩種樣式中實現它之後,我發現每個都有我原來不清楚的限制。

  • 當使用命令模式,我可以開始使用一個新的緩衝區接受更多的輸入數據,而較早的緩衝器正在由在獨立的工作線程中運行某些命令處理。我似乎無法用Decorator模式做到這一點。
  • 當使用Decorator模式,裝飾可以使任何數量的調用其委託的,並能夠將結果合併成一個大塊。它也可以分割數據,做出一個大的請求,緩存它,然後返回它的一部分。當我用一個輸入緩衝區和一個輸出緩衝區使用Command模式時,不能有任何組合或分裂結果。
+3

呵呵。我無法看到裝飾器和線程之間的連接。這些都是我認爲的正交概念。如何「調用」或「執行」裝飾器?裝飾器是['動態添加行爲到現有對象的方法]](http://en.wikipedia.org/wiki/Decorator_pattern) – sehe 2011-05-21 22:51:11

+0

通過將對象包裝到同步方法中,裝飾器可用於使任何類線程安全。在任何情況下,模式的有用性都是主題過於主觀而無法在這裏得到答案。 – ilcavero 2011-05-21 22:56:54

+0

@sehe:有一些框架,其中大部分處理是由裝飾器執行的,通過對從其代理返回的數據執行附加處理。我知道裝飾器(最初描述的)應該是輕量級的(它們爲用戶提供了一個很好的語法),所以也許重量級的裝飾器不應該是一個裝飾器的調用者? – rwong 2011-05-21 23:04:16

回答

1

您是否可以在任何線程運行裝飾是實現定義:)

如果你的裝飾器是線程安全的...是的。如果不是,請添加同步。這可能會破壞你的表現。

然而,在我看來,它使一個很大的意義的裝飾大多用它們裝飾物,和上下文/狀態之外,只有一點位佔用自己。在這裏裝飾的對象顯然應該是線程安全的(或意識到),或者即使沒有裝飾器也會有相同的問題。

或許,這就是你所說的「輕量級」裝飾。如果你的裝飾器是重量級的(因爲他們'使用世界'來完成他們的工作)肯定會有同步需求。這甚至可能導致性能瓶頸。

根本沒有排除了從你想要任何線程正在執行(一般)裝飾。