StrategyパターンとStateパターンの違い

StrategyパターンとStateパターンは、どちらもオブジェクト指向設計において動作やアルゴリズムをカプセル化するために使われるデザインパターンですが、異なる目的で使用されます。それぞれの違いを詳しく見てみましょう。

目的

Strategyパターン: Strategyパターンは、アルゴリズムや動作を選択できるようにするために使います。クライアントは、異なるアルゴリズムを動的に切り替えることができるようになります。たとえば、異なる攻撃方法を持つキャラクターが状況に応じて攻撃戦略を変える場合に適しています。

Stateパターン: Stateパターンは、オブジェクトの状態が変わることにより、そのオブジェクトの振る舞いも変わることを表現します。つまり、オブジェクトの内部状態に応じて動作が変化するような状況に使用します。たとえば、キャラクターが「通常状態」「攻撃状態」「防御状態」といった異なる状態を持ち、それに応じて振る舞いが変わる場合に適しています。

構造

Strategyパターン: Strategyパターンでは、クライアントが使用するアルゴリズムを選択するための戦略オブジェクト(Strategyオブジェクト)を持ちます。これにより、クライアントコードから具体的なアルゴリズムの実装が隠蔽され、柔軟に切り替えることができます。

Stateパターン: Stateパターンでは、オブジェクトの状態を表現する複数の状態オブジェクト(Stateオブジェクト)を持ち、オブジェクトはその内部状態に基づいて振る舞いを変えます。状態が変わると、オブジェクトの振る舞いも変化します。

オブジェクトの役割

Strategyパターン: クライアント(コンテキスト)が戦略を選択し、それを使用します。戦略を変更しても、クライアントの内部状態には影響を与えません。アルゴリズム自体が変わるだけです。

Stateパターン: コンテキストが内部状態を持ち、その状態が変化することによって、コンテキスト自体の振る舞いが変わります。状態が変わるたびに、コンテキストの振る舞いも変化します。

適用例

Strategyパターン: さまざまなアルゴリズムや方針を選択して実行する必要がある場合。たとえば、異なる計算方法、検索アルゴリズム、課金方法など。

Stateパターン: オブジェクトが異なる状態を持ち、その状態に応じて動作を変更する必要がある場合。たとえば、オブジェクトが「開始状態」「中間状態」「終了状態」などの状態を持ち、それに応じて動作が変わるケース。

まとめ

  • Strategyパターンは、異なるアルゴリズムや戦略を切り替えるために使用し、状態の変化ではなく、選択する戦略に応じて振る舞いを切り替えることに焦点を当てています。
  • Stateパターンは、オブジェクトの内部状態に応じて振る舞いが変化することに焦点を当てており、状態の変化によって動作が異なるシステムを実現します。

Strategyパターンが「何をするか」に関わる選択肢を提供するのに対し、Stateパターンは「どの状態にあるか」によって動作が変わることを表現する点で異なります。