2012-03-12 15 views
0

Go GoFデザインパターン(wikipedia)、ConcreteCommandインスタンスには、Receiverインスタンスへのリンク(参照)が必要です(必須)。適切なコマンドデザインパターンの実装にはレシーバへのリンクが必要ですか?

internal class PutBlockOntoBlockCommand : ICommand { 
    private readonly int _srcTower; 
    private readonly int _dstTower; 

    public PutBlockOntoBlockCommand(int srcTower, int dstTower) { 
     _srcTower = srcTower; 
     _dstTower = dstTower; 
    } 

    public void Execute(Robot robot, Construction construction) { 
     robot.MoveBlocks(_srcTower, _dstTower, construction); 
    } 
} 

このコマンドは、ロボットに建設現場のブロックを移動するよう指示します。このコマンドのインスタンスに受信者(ロボット)のインスタンスへの参照がないことに注意してください。その代わりに、コマンドはRobotのインスタンスを指定してコマンドを実行するためにInvoker(私の場合はRobotCommandCenter)に依存しています。

は、私は、コマンドがコマンドであるために、それはのみ意思をカプセル化するものと確信しています、とないは、コマンドのターゲットを指定するための責任を負わなければなりません。私の場合、ユーザーとしては、どのロボットを使ってジョブを実行するかは気にしません。

私の質問です: "コマンドデザインパターン"として提示された実装を参照することは技術的に有効ですか?

答えて

1

まず、デザインパターンの警察はありません。それは常に解釈に開放され、灰色の色合いで色付けされています。

第二には、ウィキペディアは元のボリュームほど良好ではない、本の中で投資を行う:)

GoFのリストCommandパターンの意図として:

として要求をカプセル化さまざまな要求、キューまたはログ要求を持つクライアントを にパラメータ化し、実行可能な操作をサポートします( )。

これらの意図のいずれかを満たしていれば、それをコマンドの派生語と呼ぶことができます。

コマンドレファレンスの所有者がこれらの詳細を処理できないように、目的のエフェクトを実装または起動するロジックを保持している場合、何かがコマンドであることを伝えることができます。多くの場合、これはカプセル化されているため、リストに入れて、基本で定義された共通のExecuteメソッドを使用して、やり直しと元に戻すことを非常にきれいに実行するなどのクールな作業を行うことができます。

基本クラスでExecuteが定義されていて、呼び出しコードがすべてのコマンドにRobotの参照を渡している場合は、コマンドがありますが、コマンドの対象を変更できる戦略またはフライウェイトのものがあります。私は、このための使用を見ることができますが、元に戻す/やり直しのようなものを犠牲にしています。

+0

私は本を持っていますが、リンクできなかったので、私はソースを参照しています。 "英語の警察"のようなものはありません、 "私は良い"を意味するものではありませんが正しいです。私の実装が "技術的に"コマンドデザインパターンであるかどうか尋ねたことに注目してください。 –

+0

@ THX-1138それは私が意味したことですが、私はコマンドパターンに「技術的な定義」があることを知らない。私が「デザインパターン警察」というユーモラスな発言で主張しているのは、それが主観的だということです。私の意見は、私が上記に述べた通りです。 – tcarvin

関連する問題