【コマンドパターン】

Commandパターン とは?

最終更新:
💡 「やること」を渡せる作業指示書にする

操作の内容をオブジェクトとして表すデザインパターン。操作を依頼する側と実際の処理を分け、履歴や遅延実行、Undo・Redoを設計する土台にする。

📌 このページのポイント
操作をCommandとして渡す Invoker Command Receiver 削除 操作を依頼 操作とデータ 対象を変更 ボタンなど をまとめる 文書など Undoを設計する例:文字を削除 実行前 ABC 実行後 AB Cを削除 Undoで戻す コマンドに保存するデータ 削除位置:2 / 削除文字:C 履歴と、戻すための処理も必要
位置は0から数える例。Undoは削除した文字と位置を保存して戻す処理を用意する。キューやUndoはすべてのCommandに必須ではない。
ひよこ ひよこ
コマンドラインのコマンドのこと?
ペンギン先生 ペンギン先生
ここでいうCommandは、操作をオブジェクトとして表す設計の名前だよ。ファイル保存やテキスト削除などの処理を、その対象や必要なデータと一緒に渡せるようにする。端末に入力するコマンドを指す用語とは使い方が違うね。
ひよこ ひよこ
普通にメソッドを呼べばいいんじゃないの?
ペンギン先生 ペンギン先生
すぐに固定の処理を呼ぶだけなら、それでよい場合もあるよ。操作をオブジェクトにすると、呼び出す側が処理の詳細を知らずに、渡す操作を差し替えたり後で実行したりしやすくなる。履歴も設計できるけれど、自動で記録されるわけではないんだ。
ひよこ ひよこ
Undoはどうやって実現するの?
ペンギン先生 ペンギン先生
実行と取り消しの処理を用意し、実行済みの履歴を管理するよ。たとえば文字を削除するなら、削除した文字と位置を保存し、Undoで戻す。undoというメソッドを作るだけでは元に戻らないし、すべての操作が取り消せるとは限らないんだ。
ひよこ ひよこ
キューに積むってどういうこと?
ペンギン先生 ペンギン先生
コマンドを並べて、後から取り出して実行することだよ。順番に処理する実行側も用意する。別スレッドで動かしたいなら、実行環境や共有データの扱いも設計する必要がある。オブジェクト化だけで非同期処理が完成するわけではないね。
ひよこ ひよこ
実際の使いどころを教えて!
ペンギン先生 ペンギン先生
エディタのUndo・Redoや、GUIのボタンに割り当てる操作の差し替えなどだよ。QtのUndoフレームワークもCommandパターンを使い、各コマンドに実行・取り消しの処理を実装する。必要な機能に合わせて履歴などを組み合わせるんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「Commandパターン」って出てきたら「操作をオブジェクトとして渡せるようにする設計」と思えればだいたいOK!
📖 おまけ:英語の意味
「Command Pattern」 = 命令のパターン
💬 Commandは命令という意味。GoFのデザインパターンとして知られ、操作をオブジェクトで表して、実行するタイミングや履歴の管理を分ける考え方だよ

参考資料

← 用語集にもどる