Pregunta

Cuando descubrí por primera vez el patrón de Estrategia, me sorprendieron las posibilidades aparentemente infinitas que me ofrecía a mí y a mis programas. Podría encapsular mejor el comportamiento de mis modelos e incluso intercambiar este comportamiento sobre la marcha. Pero la estrategia también podría utilizarse para proporcionar rasgos y carga útil al objeto que contiene, datos que se declararon en una superclase. La vida estaba bien.

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_; };

Y luego vino el patrón de Política y me permitiría una mayor flexibilidad en el suministro de parámetros a una clase contenedora; clases completas, equipadas como me gustaron, aunque intercambiando dinámicamente el comportamiento ... eso no fue demasiado fácil (a menos que sea parte de ¡la política era tener una estrategia!).

class MyMonsterTrait { typedef typename ElveAI AI; };

template< class MonsterTrait >
class Monster : public MonsterTrait::AI
{
    void idle (void) { attack(); }
};

Ambos patrones parecen ser muy poderosos para mí y me gusta usar ambos, en diferentes circunstancias. Pero no estoy seguro de si hay aplicaciones particulares / típicas / más prácticas para ambas en algunas situaciones.

Me pregunto: ¿dónde utiliza las estrategias y dónde las políticas? ¿Dónde se adaptan mejor?

¿Fue útil?

Solución

Las políticas se establecen principalmente en tiempo de compilación, mientras que las estrategias se establecen en tiempo de ejecución. Además, las políticas son generalmente un concepto de C ++ y se aplican solo a una minoría de otros idiomas (por ejemplo, D), mientras que el patrón de estrategia está disponible para muchos (¿la mayoría?) Lenguajes orientados a objetos, y lenguajes que tratan las funciones como ciudadanos de primera clase como Python .

Dicho esto:

  • Una política, que se determina en el momento de la compilación, generalmente solo es útil para situaciones especiales en las que se desea una lógica de aplicación diferente por binario. Por ejemplo, puede desarrollar un software que sea ligeramente personalizado para cada cliente, ya sea a través de una interfaz web, o manualmente, este sería un patrón basado en políticas.

  • Una estrategia se determina en tiempo de ejecución y, de hecho, se puede cambiar sobre la marcha. Por ejemplo, es posible que tenga un software que implemente una interfaz de usuario y una lógica diferentes para la fuerza de ventas que para el grupo de soporte, pero todos tienen que lidiar con la misma información del cliente y de la licencia, por lo que en lugar de tener dos aplicaciones que se mantienen por separado, simplemente tiene una aplicación cuya la interfaz cambia según sea necesario.

-Adam

Otros consejos

Pensé que eran la lo mismo .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top