Стратегия против политики и политика против стратегии - PullRequest
13 голосов
/ 24 октября 2008

Когда я впервые обнаружил паттерн «Стратегия», я был поражен, казалось бы, бесконечным возможностям, которые он предлагал мне и моим программам. Я мог бы лучше описать поведение моих моделей и даже обмениваться этим поведением на лету. Но эту стратегию также можно использовать для предоставления характеристик и полезной нагрузки содержащемуся объекту - данным, которые были объявлены в суперклассе. Жизнь была в порядке.

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(); }
};

Обе модели кажутся мне очень мощными, и мне нравится использовать обе модели в разных обстоятельствах. Но я не уверен, есть ли конкретные / типичные / более практичные приложения для какой-либо из этих ситуаций.

Мне интересно: где вы используете стратегии и где политики? Где либо лучше подходят?

Ответы [ 2 ]

24 голосов
/ 24 октября 2008

Политики в основном устанавливаются во время компиляции, а стратегии - во время выполнения. Кроме того, политики, как правило, являются концепцией C ++ и применяются только к меньшинству других языков (например, D), в то время как шаблон стратегии доступен для многих (большинства?) Объектно-ориентированных языков и языков, которые рассматривают функции как граждан первого класса, таких как python .

Как говорится:

  • Политика, определяемая во время компиляции, как правило, полезна только для особых ситуаций, когда требуется разная логика приложения для каждого двоичного кода. Например, вы можете разрабатывать программное обеспечение, слегка настроенное для каждого клиента, будь то через веб-интерфейс или вручную, это будет шаблон на основе политики.

  • Стратегия определяется во время выполнения и фактически может быть изменена на лету. Например, у вас может быть программное обеспечение, которое реализует другой пользовательский интерфейс и логику для отдела продаж, чем для группы поддержки, но все они должны иметь дело с одной и той же информацией о клиенте и лицензии, поэтому вместо двух отдельно поддерживаемых приложений у вас просто есть одно приложение, интерфейс изменяется по мере необходимости.

-Adam

4 голосов
/ 24 октября 2008

Я думал, что это было то же самое .

...