【コマンドパターン】

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機能やマクロ記録の実装によく使われるんだよ
← 用語集にもどる