Question

Lorsque j'ai découvert le modèle Strategy, j’étais émerveillé des possibilités apparemment infinies qu’il offrait à moi et à mes programmes. Je pourrais mieux encapsuler le comportement de mes modèles et même échanger ce comportement à la volée. Mais la stratégie pourrait également être utilisée pour fournir des traits et de la charge utile à l'objet contenant - des données déclarées dans une superclasse. La vie était belle.

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

Et ensuite, le modèle Policy me permettait une flexibilité encore plus grande pour la fourniture de paramètres à une classe contenante - des classes entières, équipées à ma guise, bien que j'échange dynamiquement le comportement ... ce n'était pas trop facile (sauf si la politique était d'avoir une stratégie!).

class MyMonsterTrait { typedef typename ElveAI AI; };

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

Les deux modèles semblent être très puissants pour moi et j'aime les utiliser dans des circonstances différentes. Mais je ne suis pas sûr s'il existe des applications particulières / typiques / plus pratiques dans certaines situations.

Je me demande: où utilisez-vous les stratégies et où les politiques? Où sont-ils les mieux adaptés?

Était-ce utile?

La solution

Les stratégies sont en grande partie définies au moment de la compilation, tandis que les stratégies sont définies au moment de l'exécution. En outre, les stratégies sont généralement un concept C ++ et ne s'appliquent qu'à une minorité d'autres langages (par exemple, D), tandis que le modèle de stratégie est disponible pour de nombreux langages orientés objet (la plupart?), Et les langages qui traitent les fonctions comme des citoyens de première classe comme python. .

Cela étant dit:

  • Une règle, déterminée au moment de la compilation, n'est généralement utile que dans des situations spéciales dans lesquelles vous souhaitez une logique d'application différente sur une base binaire. Par exemple, vous pourriez développer un logiciel légèrement personnalisé pour chaque client, que ce soit via une interface Web ou manuellement, il s'agirait d'un modèle basé sur des règles.

  • Une stratégie est déterminée au moment de l'exécution et peut en fait être modifiée à la volée. Par exemple, vous pouvez avoir un logiciel qui implémente une interface utilisateur et une logique différentes pour la force de vente et pour le groupe de support, mais ils doivent tous traiter avec le même client et les mêmes informations de licence. Par conséquent, au lieu de disposer de deux applications gérées séparément, vous avez simplement une application dont l’interface change au besoin.

-Adam

Autres conseils

Je pensais que c’était la la même chose .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top