Domanda

Quando ho scoperto per la prima volta il modello di strategia, sono rimasto sorpreso dalle possibilità apparentemente infinite che offriva a me e ai miei programmi. Potrei incapsulare meglio il comportamento dei miei modelli e persino scambiarlo al volo. Ma la strategia potrebbe anche essere usata per fornire tratti e payload all'oggetto contenente - dati che sono stati dichiarati in una superclasse. La vita andava bene.

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

E poi è arrivato il modello di politica e mi consentirebbe una flessibilità ancora maggiore nel fornire parametri a una classe contenente - intere classi, equipaggiate come mi piaceva, anche se scambiare dinamicamente il comportamento ... che non era troppo facile (a meno che parte di la politica era quella di avere una strategia!).

class MyMonsterTrait { typedef typename ElveAI AI; };

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

Entrambi i modelli sembrano essere molto potenti per me e mi piace usarli entrambi, in circostanze diverse. Ma non sono sicuro che ci siano applicazioni particolari / tipiche / più pratiche in entrambe le situazioni.

Mi chiedo: dove usi le strategie e dove le politiche? Dove sono più adatti?

È stato utile?

Soluzione

Le politiche sono in gran parte impostate al momento della compilazione, mentre le strategie sono impostate in fase di esecuzione. Inoltre, le politiche sono generalmente un concetto C ++ e si applicano solo a una minoranza di altre lingue (ad esempio D), mentre il modello di strategia è disponibile per molti (la maggior parte?) Linguaggi orientati agli oggetti e linguaggi che trattano le funzioni come cittadini di prima classe come Python .

Detto questo:

  • Una politica, essendo determinata in fase di compilazione, è generalmente utile solo per situazioni speciali in cui si desidera una diversa logica applicativa su base binaria. Ad esempio, è possibile sviluppare software leggermente personalizzato per ciascun cliente, tramite un'interfaccia Web o manualmente, questo sarebbe un modello basato su criteri.

  • Una strategia è determinata in fase di esecuzione e in effetti può essere modificata al volo. Ad esempio, potresti avere un software che implementa un'interfaccia utente e una logica diverse per la forza vendita rispetto al gruppo di supporto, ma devono tutti avere a che fare con le stesse informazioni su clienti e licenze, piuttosto che avere due app gestite separatamente hai semplicemente un'app la cui app l'interfaccia cambia secondo necessità.

-Adam

Altri suggerimenti

Pensavo fossero le stessa cosa .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top