2008-10-23 10 views
11

Als ich das Strategie-Muster zum ersten Mal entdeckte, war ich erstaunt über die scheinbar endlosen Möglichkeiten, die es mir und meinen Programmen bot. Ich könnte das Verhalten meiner Models besser einkapseln und dieses Verhalten sogar spontan austauschen. Aber die Strategie könnte auch verwendet werden, um Eigenschaften und Nutzinformationen für das enthaltene Objekt bereitzustellen - Daten, die in einer Oberklasse deklariert wurden. Das Leben war in Ordnung.Eine Strategie gegen die Politik und eine Strategie gegen die Strategie

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

Und entlang kamen die Muster-Politik und es würde mir noch mehr Flexibilität ermöglichen, bei der Versorgung Parameter an einem enthaltenden Klasse - ganze Klassen, ausgestattet aber ich mochte, wenn auch das Verhalten dynamisch auszutauschen ... das nicht zu einfach war (es sei denn, ein Teil der Richtlinie sollte eine Strategie haben!).

Beide Muster scheinen sehr mächtig zu sein, und ich mag beide unter verschiedenen Umständen zu verwenden. Aber ich bin mir nicht sicher, ob es in einigen Situationen bestimmte/typische/praktischere Anwendungen gibt.

Ich frage mich: Wo verwenden Sie Strategien und wo Richtlinien? Wo sind sie besser geeignet?

+1

Ihr Beitrag ist so ziemlich die Zusammenfassung, warum ich C++ hassen – Mecki

+0

Aber es hat einen großen Titel! – Mnebuerquo

Antwort

21

Richtlinien werden größtenteils zur Kompilierungszeit festgelegt, während Strategien zur Laufzeit festgelegt werden. Darüber hinaus sind Richtlinien im Allgemeinen ein C++ - Konzept und gelten nur für eine Minderheit anderer Sprachen (z. B. D), während Strategiemuster für viele (meist?) Objektorientierte Sprachen und Sprachen verfügbar sind, die Funktionen als erstklassige Bürger wie Python behandeln .

Dass gesagt wird:

  • Eine Politik, bei der Kompilierung festgelegt wird, in der Regel für spezielle Situationen nur dann sinnvoll ist, wo man verschiedene Anwendungslogik auf einer Pro-binäre Basis will. Zum Beispiel könnten Sie Software entwickeln, die für jeden Kunden leicht angepasst wird, sei es über eine Webschnittstelle oder per Hand, dies wäre ein richtlinienbasiertes Muster.

  • Eine Strategie wird zur Laufzeit festgelegt und kann tatsächlich im laufenden Betrieb geändert werden. Zum Beispiel haben Sie vielleicht Software, die eine andere Benutzeroberfläche und Logik für den Salesforce als für die Support-Gruppe implementiert, aber sie alle müssen mit den gleichen Kunden und Lizenzinformationen zu tun, anstatt zwei separat gepflegte Apps haben Sie einfach eine App, deren Schnittstelle ändert sich nach Bedarf.

-Adam

4

Ich dachte, sie waren die same thing.

+0

Das war meine erste Reaktion auch. –

+0

Art von http://en.wikipedia.org/wiki/Policy-based_design –