Стратегия против политики и политика против стратегии

StackOverflow https://stackoverflow.com/questions/231318

Вопрос

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

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

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

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

Это было полезно?

Решение

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

Что, как говорится:

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

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

-Адам

Другие советы

Я думал, что это одно и то же .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top