Когда я впервые обнаружил паттерн «Стратегия», я был поражен, казалось бы, бесконечным возможностям, которые он предлагал мне и моим программам. Я мог бы лучше описать поведение моих моделей и даже обмениваться этим поведением на лету. Но эту стратегию также можно использовать для предоставления характеристик и полезной нагрузки содержащемуся объекту - данным, которые были объявлены в суперклассе. Жизнь была в порядке.
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_; };
И вместе с этим появился шаблон Policy, который позволил бы мне еще более гибко предоставлять параметры содержащему классу - целым классам, как мне хотелось, хотя и динамически обмениваться поведением ... это было не слишком легко (если не политика должна была иметь стратегию!).
class MyMonsterTrait { typedef typename ElveAI AI; };
template< class MonsterTrait >
class Monster : public MonsterTrait::AI
{
void idle (void) { attack(); }
};
Обе модели кажутся мне очень мощными, и мне нравится использовать обе модели в разных обстоятельствах. Но я не уверен, есть ли конкретные / типичные / более практичные приложения для какой-либо из этих ситуаций.
Мне интересно: где вы используете стратегии и где политики? Где либо лучше подходят?