Strategy パターンを初めて発見したとき、私と私のプログラムに無限の可能性をもたらしてくれたことに驚きました。モデルの動作をより適切にカプセル化し、この動作をその場で交換することさえできます。しかし、この戦略を使用して、含まれているオブジェクト (スーパークラスで宣言されたデータ) に特性とペイロードを提供することもできます。人生は順調でした。
class MyMonsterAI { float const see_radius_; virtual void attack () = 0; /* .. */ };
class ElveAI { ElveAI() : see_radius_(150.0f) {} /* ... */ };
class CycloneAI { CycloneAI() : see_radius_(50.0f) {} /* ... */ };
class Monster { MyMonsterAI* ai_; };
そして、ポリシーパターンが登場し、それを含むクラスにパラメーターを提供する際の柔軟性がさらに向上しました-動作を動的に交換しますが、好きなように装備されたクラス全体...それはあまり簡単ではありませんでした(ポリシーの一部があった場合を除く)戦略を立てる!)
class MyMonsterTrait { typedef typename ElveAI AI; };
template< class MonsterTrait >
class Monster : public MonsterTrait::AI
{
void idle (void) { attack(); }
};
どちらのパターンも私には非常に強力なように思え、さまざまな状況で両方を使用するのが好きです。しかし、状況によっては、特定の/典型的な/より実用的なアプリケーションがあるかどうかはわかりません。
私は疑問に思っています: どこで戦略を使用し、どこでポリシーを使用しますか? どこがより適していますか?