Dyuichi Blog

オブジェクト指向シリーズⅣ: デザインパターン [㉒ Command]

概要

commandは日本語で「指示」,「命令」という意味になる.Commandパターンは,リクエストをオブジェクトとしてカプセル化するパターンである.

命令を呼び出すオブジェクトと命令実行するオブジェクトを分離できる.

Commandパターンの主な要素は以下である.

  • Command:コマンド実行のインターフェース
  • ConcreteCommand:Commandを実装したクラス
  • Invoker:Commandインターフェースで定義されているメソッドを呼び出す
  • Receiver:コマンド実行時のロジックを実装したクラス

クラス図

画像が読み込まれない場合はページを更新してみてください。

実装例(Java)

java// Command
interface Command {
    void execute();
}

// Concrete Command
class ConcreteCommand implements Command {
    private Receiver receiver;
    public ConcreteCommand(Receiver receiver) {
        this.receiver = receiver;
    }
    @Override
    public void execute() {
        receiver.action();
    }
}

// Receiver
class Receiver {
    public void action() {
        System.out.println("Receiver action");
    }
}

// Invoker
class Invoker {
    private Command command;
    public Invoker(Command command) {
        this.command = command;
    }
    public void call() {
        command.execute();
    }
}

// Client
public class CommandPattern {
    public static void main(String[] args) {
        Receiver receiver = new Receiver();
        ConcreteCommand command = new ConcreteCommand(receiver);
        Invoker invoker = new Invoker(command);
        invoker.call();
    }
}

まとめ,所感

Webで使う場面があるとすれば,バッチ処理命令が考えられる.メール一括送信処理とかで使えそう.ん,バッチ処理じゃなくてもただのメール送信でもCommandパターンは使えそう.てことはバッチ処理は関係ないか.

たしかLaravelにもCommandがあった.実際にCommandパターンを使用していたかどうかは覚えていないが…