コマンドパターンの場合:
クライアントの参加者が呼び出し側の参加者と同じクラスであってはならないのはなぜですか?クライアント参加者と呼び出し側参加者が同じクラスになる可能性があるシナリオはありますか?
コマンドパターンの場合:
クライアントの参加者が呼び出し側の参加者と同じクラスであってはならないのはなぜですか?クライアント参加者と呼び出し側参加者が同じクラスになる可能性があるシナリオはありますか?
最大の理由は、単一責任の原則に違反していることです。クライアントの参加者とインボーカーの参加者はどちらも個別の責任を負い、一方の変更は他方に影響を与えます。
1) クライアントの主な責任は、Invoker、Receiver、および Command オブジェクトの適切なインスタンス化と、適切な場所と時間での実行手順の開始です。
たとえば、このようなものになる可能性があります
class Client {
...
invoker.executeCommand()
...
}
2) Invoker の主な役割は、Command オブジェクトの 1 つ以上のコマンド メソッドを特定の順序で呼び出すことです。
例えば、
class Invoker {
...
command.command1();
command.command2();
command.command3();
...
}
たとえば、java.awt.event.KeyListener クラスを考えてみましょう。次の順序で呼び出される 3 つのメソッドがあります。
keyPressed(KeyEvent e)
keyTyped(KeyEvent e)
keyReleased(KeyEvent e)
このリスナーの Invoker クラスは次のようになります。
class KeyInvocation {
KeyListener listener;
void invokeKey(EventObject e) {
listener.keyPressed(e);
listener.keyTyped(e);
listener.keyReleased(e);
}
}
その間、Client クラスは EventObject、KeyListener、および KeyInvocation を適切にインスタンス化し、適切な場所と時間で invokeKey メソッドを実行する必要があります。
もちろん、Invoker は Command パターンの追加レイヤーです。Command パターンのより単純なケースでは、Invoker クラスをまったくスキップして、Client 1 ですべての作業を行うことができます。