Strategy パターンとは
Strategy パターンは、ソフトウェア開発におけるデザインパターンの一つで、
アルゴリズムをカプセル化し、実行時に選択できるようにするものです。これにより、プログラムの柔軟性と拡張性を向上させることができます。このパターンでは、
アルゴリズムをクラスとして定義し、インターフェースを介して利用することで、具体的な実装に依存することなく
アルゴリズムを切り替えることが可能です。
Strategy パターンの仕組み
Strategy パターンでは、
アルゴリズムを記述する
サブルーチンへの参照をデータ構造の内部に保持します。この参照は、関数ポインタ、
関数オブジェクト、デリゲートなどを用いて実現されます。オブジェクト指向プログラミングでは、
ポリモーフィズムと
委譲、あるいはリフレクションによる動的ダック・タイピングなども利用されます。
関数が
第一級オブジェクトである言語(例えば
Python)では、Strategy パターンは暗黙のうちに使用されていることがあります。これは、関数を他の関数の引数として渡したり、変数に格納したりできるため、
アルゴリズムを柔軟に切り替えられるためです。
Strategy パターンの利点
- - アルゴリズムの切り替え: Strategy パターンは、アプリケーションで使用されるアルゴリズムを動的に切り替える必要がある場合に非常に有用です。例えば、異なるソートアルゴリズムを状況に応じて使い分けたい場合などに役立ちます。
- - アルゴリズムの独立性: アルゴリズムをStrategyとして定義することで、アルゴリズムを使用する側は具体的な実装に依存せずに、アルゴリズムを切り替えることができます。これにより、コードの再利用性と保守性が向上します。
- - 柔軟性と拡張性: Strategy パターンは、新しいアルゴリズムを追加したり、既存のアルゴリズムを変更したりする際に、既存のコードに大きな変更を加える必要がないため、柔軟性と拡張性に優れています。
実装例
Javaでは、インターフェースとクラスのメソッド
オーバーライドによる
ポリモーフィズムを利用してStrategyパターンを実装できます。インターフェースで
アルゴリズムを定義し、具体的なクラスで実装します。
Pythonでは、関数が
第一級オブジェクトであるため、関数を他の関数に渡すことでStrategyパターンを簡単に実現できます。コールバック関数を用いたGUIプログラミングなどがその例です。
C#
C#でも
Javaと同様にクラスやインターフェースによる
ポリモーフィズムを使用できます。また、カスタマイズポイントがメソッド一つしかない場合は、デリゲートを使うことで、より簡潔にStrategyパターンを実現できます。
Strategy パターンと開放/閉鎖原則
Strategy パターンは、開放/閉鎖原則(OCP)に適合する設計を促進します。開放/閉鎖原則とは、ソフトウェアのエンティティ(クラス、モジュール、関数など)は、拡張に対しては開いていて、変更に対しては閉じていなければならないという原則です。
Strategy パターンでは、継承ではなく合成(コンポジション)を使用します。
アルゴリズムをインターフェースとして定義し、具体的なクラスで実装することで、
アルゴリズムを切り替える際に既存のクラスを変更する必要がなくなります。これにより、新しい
アルゴリズムを追加したり、既存の
アルゴリズムを変更したりする際に、コードの変更範囲を最小限に抑えることができます。
例:自動車の動作
例えば、自動車クラス(Car)のブレーキとアクセルの動作を考えてみましょう。これらの動作は車種によって異なる場合があります。
継承を利用すると、車種ごとにサブクラスを作成し、それぞれの動作を実装する必要があります。しかし、この方法では、同じ動作でも車種ごとにコードを重複して記述する必要が生じ、コードの管理が複雑になります。
Strategy パターンでは、ブレーキやアクセルの動作をインターフェースとして定義し、具体的な実装をクラスとして作成します。そして、Carクラスはこれらのインターフェースを介して動作を利用します。これにより、車種ごとに動作を切り替えることが容易になり、コードの重複も避けることができます。
例えば、ABS付きのブレーキ(BrakeWithABS)から通常のブレーキ(Brake)に切り替える場合、CarオブジェクトのブレーキのStrategyを変更するだけで実現できます。これにより、既存のCarクラスに影響を与えることなく、柔軟に動作を切り替えることができます。
まとめ
Strategy パターンは、
アルゴリズムをカプセル化し、実行時に切り替えることができる強力なデザインパターンです。柔軟性、拡張性、保守性を向上させることができ、開放/閉鎖原則に適合する設計を促進します。
アルゴリズムの切り替えが必要な場面では、ぜひStrategyパターンの利用を検討してみてください。
関連項目
ミックスイン
en:Policy-based design
en:First-class function
Template Method パターン
Bridge パターン
開放/閉鎖原則
Factory パターン
en:List of object-oriented programming terms (オブジェクト指向の用語一覧)
外部リンク
Strategy Pattern for Java article
Data & object factory
Refactoring: Replace Type Code with State/Strategy
Jt J2EE Pattern Oriented Framework
*
Strategy Pattern with a twist!