2009-05-20 15 views
1

コマンドパターン:コマンドパターン:クライアントと呼び出し元

なぜ、クライアントの参加者が呼び出し元の参加者と同じクラスであるべきではないのですか?クライアント参加者とインボーカー参加者が同じクラスになる可能性のあるシナリオはありますか?

+0

[コマンドデザインパターン - インボーカはオプションですか?](http://stackoverflow.com/questions/12879609/command-design-pattern-is-invoker-optional)の可能な複製。これは早いですが、もう一方はもっと情報があります。 – outis

答えて

4

最大の理由は、単一の責任原則に違反していることです。クライアント参加者と参加者はどちらも個別の責任を負い、一方を変更すると他方に影響します。

0

1)クライアントの主な責任は、Invoker、Receiver、Commandオブジェクトの適切なインスタンス化であり、適切な場所と時間に実行手順を開始することです。

それは、例えば、実行者のためのこの

class Client { 

... 

invoker.executeCommand() 

... 

} 

2)主な責任のようなものかもしれないと、特定の順序でコマンドオブジェクトの一つ以上のコマンドメソッドを呼び出すことです。

class Invoker { 

... 
command.command1(); 
command.command2(); 
command.command3(); 
... 

} 

はのは、例えば、java.awt.event.KeyListenerのクラスを考えてみましょうたとえば

、。これは、次の順序で呼び出された3つの方法があります。

keyPressed(KeyEvent e) 
keyTyped(KeyEvent e) 
keyReleased(KeyEvent e) 
このリスナーの

の発動クラスは次のようになります。

class KeyInvocation { 
    KeyListener listener; 

    void invokeKey(EventObject e) { 
     listener.keyPressed(e); 
     listener.keyTyped(e); 
     listener.keyReleased(e); 
    } 
} 

その間クライアントクラスは、適切なインスタンス化EVENTOBJECT、のKeyListenerとKeyInvocationとは、適切に実行する必要がありますinvokeKeyメソッドの場所と時間。

もちろん、InvokerはCommandパターンの追加レイヤーです。 Commandパターンの単純なケースでは、Invokerクラスをまったくスキップして、クライアント1のすべての作業を行うことができます。

関連する問題