メインコンテンツまでスキップ

🔍 Command と Strategy の比較

✅ 比較の目的

CommandStrategy は、いずれも「処理の抽象化と差し替え」を目的としたパターンであるが、その適用目的や使用場面には明確な違いがある。本比較では、構造や利用目的、実務での応用観点から両者を整理し、設計判断の指針を得ることを目的とする。

✅ 比較の観点

比較項目Command(コマンド)Strategy(戦略)
目的処理自体をオブジェクトとしてカプセル化するアルゴリズムや振る舞いを切り替え可能にする
主な用途履歴管理、Undo/Redo、バッチ処理など処理の柔軟な切り替え、実行時の戦略変更
構造コマンド + 受信者 + 呼び出し元の構成戦略インターフェース + 複数の実装クラス
再利用性処理単位の再利用がしやすい振る舞い単位で他文脈でも再利用しやすい
拡張性新しい処理 = 新しいコマンドクラスを追加新しい振る舞い = 新しい戦略クラスを追加
典型的な例GUI 操作、バッチ処理、Undo 機構など課金方式の切り替え、並び替え処理など

✅ 類似点

  • 処理(動作)をオブジェクトとして抽象化する
  • インターフェースを通じて呼び出し可能な共通構造を持つ
  • 呼び出し元は、具体的な処理内容を意識せず操作できる
  • 実装を差し替えることで動作を柔軟に変更可能

✅ 決定的な違い

観点Command パターンStrategy パターン
目的処理の実行タイミングや履歴の管理アルゴリズムや振る舞いの差し替え
主体「命令」の定義と履歴の管理「処理内容」の選択と注入
取り消し処理undo() などで明示的に取り消し可能基本的に取り消しは対象外
呼び出し役Invoker が中心。Command を操作するContext が Strategy を切り替えて使用
主な活用場面Undo/Redo、非同期処理、キュー実行処理戦略の切り替え、ポリシー適用

✅ 選び分けの判断軸

  • 履歴管理や再実行が必要Command
  • アルゴリズムや処理方針の切り替えStrategy
  • 操作単位で抽象化し記録したいCommand
  • 柔軟に処理方式を切り替えたいStrategy

✅ UML クラス図

Command パターン

Strategy パターン

✅ 実務でのヒント

  • Command は、「何をやったか」を記録したい時に最適(バッチ処理、エディタの操作履歴など)
  • Strategy は、処理方式を外部から注入・切り替えたい時に便利(通知方式、認証手段など)
  • ▶️ 両者を併用することも可能:バッチ処理の中で通知方法を戦略として切り替えるなど

✅ まとめ

  • Command は「処理そのものをオブジェクト化」して、実行・取り消し・履歴管理ができる
  • Strategy は「処理のやり方を切り替えるための注入構造」を提供する
  • 似た構造ながら、履歴・操作単位で設計するか/切り替え可能なポリシーとして設計するか で大きく意味が異なる