以前のプロジェクトでコマンドパターンがどのように使用されたかを見て、コマンドは異なるスレッドで実行できるため、マルチスレッド(並列)プログラミングでどのように役立つかを理解できます。コマンド間でデータを渡す必要がある場合は、データを共有メモリに格納し、そのデータへのポインタ(またはハンドル)を別のスレッドの呼び出し元に渡すことができます。
ただし、デコレータパターンには、すべてが単一のスレッドで発生する必要があるという制限があるようです。これは、デコレータがデリゲートを直接呼び出す必要があるため、同じスレッド上にある必要があることを意味します。
この制限についての私の理解は正しいですか?それどころか、複数のスレッドでデコレータを実行することは可能ですか?
私が実装しようとしているのは、データのストリームを処理するパイプラインです。
- コマンドパターンとして実装するには、その
execute
メソッドは2つの引数を取ります。入力用のバッファーと出力用のバッファーです。 - デコレータパターンとして実装するために、その
getdata
メソッドはデリゲートを呼び出して前のステップの結果を取得し、独自の処理を適用して、結果を呼び出し元に返します。
しかし、両方のスタイルで実装した後、それぞれに元々明確ではなかった制限があることがわかりました。
- コマンドパターンを使用すると、新しいバッファーを使用してより多くの入力データの受け入れを開始できますが、以前のバッファーは、別々のワークスレッドで実行されているいくつかのコマンドによって処理されます。デコレータパターンではこれができないようです。
- デコレータパターンを使用する場合、デコレータはデリゲートに対して任意の数の呼び出しを行い、結果を1つのチャンクに結合することができます。また、1つの大きなリクエストを作成してキャッシュし、その一部を返すことで、データを分割することもできます。1つの入力バッファと1つの出力バッファでコマンドパターンを使用する場合、結果の組み合わせや分割はできません。