2008-10-23 10 views
11

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

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 entonces llegó el Patrón de política y me permitiría una mayor flexibilidad en el suministro de parámetros a una clase que contiene - clases enteras, equipado sin embargo, me ha gustado, aunque intercambiar dinámicamente el comportamiento ... que no era demasiado fácil (¡a menos que parte de la política fuera 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 potentes 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 cualquiera de las dos situaciones.

Me pregunto: ¿dónde usas estrategias y dónde políticas? ¿Dónde están más adecuados?

+1

Tu entrada es más o menos el resumen de por qué odio a C++ – Mecki

+0

pero tiene un gran título! – Mnebuerquo

Respuesta

21

Las políticas se configuran 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 funciones como ciudadanos de primera clase como python .

Dicho esto:

  • una política, que se determina en tiempo de compilación, generalmente sólo es útil para situaciones especiales en las que desee diferente lógica de la aplicación sobre una base per-binario. Por ejemplo, podría desarrollar un software ligeramente personalizado para cada cliente, ya sea a través de una interfaz web, o a mano, esto 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, puede tener un software que implemente una interfaz y lógica de usuario diferente para la fuerza de ventas que para el grupo de soporte, pero todos deben tratar con la misma información de cliente y licencia, así que en lugar de tener dos aplicaciones mantenidas por separado, simplemente tiene una aplicación cambios de interfaz según sea necesario.

-Adam

4

Pensé que eran same thing.

+0

Esta fue mi primera reacción también. –

+0

tipo de http://en.wikipedia.org/wiki/Policy-based_design –

Cuestiones relacionadas