ストラテジーパターンとは デザインパターンの原則

オブジェクト指向の特徴として、再利用性がある。
クラスを継承してサブクラスにメソッドを追加したり、親クラスのメソッドをオーバーライドして使うことににより、親クラスの機能をそのまま、再利用できるため、開発効率が高まる。

この考えはオブジェクト指向の再利用性における、非常に優れた一面である。
しかしながら、デメリットも存在する。

それは、親クラスを修正した場合、その修正は同時にその親クラスを継承した子クラスにも影響範囲が波及する。
ここに一つの真実が隠されている。
継承は親クラスと子クラス間の結合度強くなってしまうため、再利用性は高まるが、保守性、柔軟性は低下してしまうのである。

ここで、再利用性を高めながら、保守性、柔軟性を高めるデザインパターンが存在する。
それがStrategyパターンである。

このパターンは、ある振舞い(メソッド)を各子クラスで動的に変更したい場合に有効な手段である。
Strategyパターンでは、この子クラスで変更したい振舞い(メソッド)を別の振舞いクラスとして外出し、インターフェースでカプセル化してしまう。
そして、親クラスの属性としてこの振舞いクラスとコンポジションで結ぶことにより柔軟性を高めることに成功している。

例えば、猫をモデルとしてみる。
猫の振舞いは、鳴いたり、寝たり、飛んだりする。
ここで、猫の種類によって、鳴き声が変わるモデルを示す。

まずは継承を使った場合

この場合、「鳴く」メソッドを子クラスでオーバライドする方法である。

NewImage

次にStrategyパターンを使った場合。
「鳴く」振舞いをクラス化している。

NewImage

こうすると、例えばキジトラ猫の鳴き声を「にゃーにゃー」に変更したい場合など、猫クラスやキジトラクラスを修正することなく、このクラスをコントロールするクラスの修正だけで変更が可能になる。
また、新しい猫クラス「黒猫」を作成し、鳴き声を「ギャーギャー」としたい場合でも「ギャーギャー」振舞いクラスを再利用することで対応可能である。

これは、設計原則の「継承よりもコンポジションを好む」という原則に従う。

しかしながら、クラス図を見てもらうとわかるように、このパターンを使うことでクラス図全体が複雑になってしまうというデメリットが存在する。これはKISSの原則(Keep it simple, stupid)に反することでもある。

デザインパターン全体に言えることだが、どんな場合でもデザインパターンが優れているというわけではなく、使う、使わないを、将来どのように使われるか設計方針(修正が入る可能性があるのか、機能拡張する可能性があるのか等)より判断する必要がある

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です