Когда я впервые обнаружил шаблон стратегии, я был поражен, казалось бы, бесконечными возможностями, которые он мне предлагал и моими программами. Я мог бы лучше инкапсулировать поведение моих моделей и даже менять это поведение на лету. Но стратегия также может быть использована для предоставления признаков и полезной нагрузки для содержащего объекта - данных, которые были объявлены в суперклассе. Жизнь была прекрасна.
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(); }
};
Оба шаблона кажутся очень мощными для меня, и мне нравится использовать их в разных обстоятельствах. Но я не уверен, что в некоторых ситуациях есть конкретные/типичные/более практичные приложения.
Мне интересно: где вы используете стратегии и политики? Где лучше всего подходят?