サーチ…


Javaにおけるコマンドパターンの例

ウィキペディアの定義:

コマンドパターンは、動作を実行するために必要なすべての情報をカプセル化するためにオブジェクトを使用したり、後でイベントをトリガする動作デザインパターンです

dofactoryの UML図:

ここに画像の説明を入力

基本的なコンポーネントとワークフロー:

  1. Commandexecute()ような抽象コマンドのインタフェースを宣言します。
  2. Receiverは特定のコマンドの実行方法を知っています
  3. InvokerConcreteCommand保持していますが、実行する必要があります
  4. ClientConcreteCommandを作成し、 Receiverを割り当てます
  5. ConcreteCommandCommandReceiver間のバインディングを定義します

このようにして、コマンドパターンは、 Sender (クライアント)をReceiverからInvokerに切り離します。 Invokerは、特定の操作を実行するために呼び出されるReceiverと、 Commandが実行されるCommandCommandが完全に分かっています。

コードスニペット:

interface Command {
    void execute();
}
class Receiver {
    public void switchOn(){
        System.out.println("Switch on from:"+this.getClass().getSimpleName());
    }
}
class OnCommand implements Command{
    private Receiver receiver;

    public OnCommand(Receiver receiver){
        this.receiver = receiver;
    }
    public void execute(){
        receiver.switchOn();
    }
}
class Invoker {
    private Command command;
  
    public Invoker(Command command){
        this.command = command;
    }
    public void execute(){
        this.command.execute();
    }
}

class TV extends Receiver{
    
    public String toString(){
        return this.getClass().getSimpleName();
    }
}
class DVDPlayer extends Receiver{
    
    public String toString(){
        return this.getClass().getSimpleName();
    }
}

public class CommandDemoEx{
    public static void main(String args[]){
        // On command for TV with same invoker 
        Receiver receiver = new TV();
        Command onCommand = new OnCommand(receiver);
        Invoker invoker = new Invoker(onCommand);
        invoker.execute();
        
        // On command for DVDPlayer with same invoker 
        receiver = new DVDPlayer();
        onCommand = new OnCommand(receiver);
        invoker = new Invoker(onCommand);
        invoker.execute();            
    }
}

出力:

Switch on from:TV
Switch on from:DVDPlayer

説明:

この例では、

  1. コマンドインタフェースはexecute()メソッドを定義します。
  2. OnCommandConcreteCommandでexecute()メソッドを実装execute()ます。
  3. レシーバは基本クラスです。
  4. TVDVDPlayerReceiverの 2つのタイプで、OnCommandのようなConcreteCommandに渡されます。
  5. Invokerにコマンドが含まれています。これは、SenderとReceiverを分離するための鍵です。
  6. InvokerReceiver (TV)を呼び出してこのコマンドを実行するOnCommand - >を受け取ります。

Invokerを使用することで、TVとDVDPlayerを切り替えることができます。このプログラムを拡張すると、TVとDVDPlayerの両方がオフになります。

主な使用例:

  1. コールバックメカニズムを実装するには
  2. アンドゥとリドゥ機能を実装するには
  3. コマンドの履歴を維持する


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow