【コマンドパターン】

Commandパターン とは?

公開:
💡 「やること」をオブジェクトに詰めてキューに並べる作業指示書パターン
📌 このページのポイント
Commandパターン Invoker コマンドを呼ぶ Commandキュー ①SaveCmd ②DeleteCmd ... execute() / undo() Receiver 実際の処理を行う 実行履歴スタック DeleteCmd SaveCmd Undo → undo() を逆順呼び出し 実行後に記録 操作をオブジェクト化することでUndo/Redoが自然に実現できる
Commandパターン:コマンドをオブジェクト化してキューに積み、Undoも管理する
ひよこ ひよこ
Commandパターンって、コマンドラインのコマンドと関係あるの?
ペンギン先生 ペンギン先生
関係ないんだ。操作(コマンド)をオブジェクトとして表現するデザインパターンだよ。「ファイルを保存する」「テキストを削除する」といった処理を、それぞれオブジェクトにするんだ。
ひよこ ひよこ
普通にメソッドを呼べばいいんじゃないの?
ペンギン先生 ペンギン先生
メソッド直呼びだと「何をやったか」の履歴が残らないんだ。Commandオブジェクトにすると、実行したコマンドをリストに保存できるから、Undo/Redoが自然に実装できるよ。
ひよこ ひよこ
Undoはどうやって実現するの?
ペンギン先生 ペンギン先生
各コマンドに `execute()` と `undo()` メソッドを持たせるんだよ。「実行したコマンドのスタック」を保持して、Undoするときは最後のコマンドの `undo()` を呼ぶだけだよ。
ひよこ ひよこ
キューに積むってどういうこと?
ペンギン先生 ペンギン先生
コマンドオブジェクトをキューに積んでおいて、後で順番に実行したり、別スレッドで実行したりできるよ。ジョブキューやマクロ記録にも応用できるんだ。
ひよこ ひよこ
実際の使いどころを教えて!
ペンギン先生 ペンギン先生
テキストエディタのUnd/Redo、GUIボタンへの操作バインド、トランザクション処理、ゲームのリプレイ機能などに使われるよ。「操作を記録・再生したい」という要件によく登場するんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「Commandパターン」って出てきたら「操作をオブジェクトにしてUndoやキューを実現するパターン」と思えればだいたいOK!
📖 おまけ:英語の意味
「Command Pattern」 = コマンドパターン
💬 コンピュータへの「命令(Command)」をそのままオブジェクトに見立てたGoFのデザインパターンだよ。テキストエディタのUnd/Redo機能やマクロ記録の実装によく使われるんだよ
← 用語集にもどる