[[デザインパターン]] * Strategy [#ta71de7a] ** 適応可能性 [#b0e938eb] - 関連する多くのクラスが振る舞いのみ異なっている場合。Strategy パターンは、多くの振る舞いの中の1つでクラスを構成する方法を提供する。 - 複数の異なるアルゴリズムを必要とする場合。たとえば、空間と時間のトレードオフを反映する複数のアルゴリズムを定義する場合が考えられる。このとき、複数のアルゴリズムをクラス階層[HO87]として実装していく際に、Strategy パターンを利用することができる。 - アルゴリズムが、クライアントが知るべきではないデータを利用している場合。Strategy パターンを利用することにより、複雑でアルゴリズムに特有なデータ構造を公開するのを避けることができる。 - クラスが多くの振る舞いを定義しており、これらがオペレーション内で複数の条件文として現れている場合。このとき、多くの条件文を利用する代わりに、条件分岐後の処理を Strategy クラスに移し換える。 ** 構造 [#z3e4f19d] &ref(strategy.gif); *** 構成要所 [#g4ba43b4] *** 構成要素 [#g4ba43b4] : Strategy クラス | -- サポートするすべてのアルゴリズムに共通のインタフェースを宣言する。Context クラスは、ConcreteStrategy クラスにより定義されるアルゴリズムを呼び出すためにこのインタフェースを利用する。 : ConcreteStrategy クラス | -- Strategy クラスのインタフェースを利用して、アルゴリズムを実装する。 : Context クラス | -- ConcreteStrategy オブジェクトを備えている。 -- Strategy のオブジェクトに対する参照を保持する。 -- Strategy クラスが Context クラスのデータにアクセスするためのインタフェースを定義してもよい。 ** 目的 [#h9f577df] アルゴリズムの集合を定義し、各アルゴリズムをカプセル化して、それらを交換可能にする。Strategy パターンを利用することで、アルゴリズムを、それを利用するクライアントからは独立に変更することができるようになる。 ** コメント [#id717296] #comment