Domanda

Come funziona, a cosa serve e quando si dovrebbe usare?

È stato utile?

Soluzione

Proviamo a spiegare il modello di strategia nel modo più semplice:

Si dispone di una classe Car() con un metodo run(), così si usa in questo modo in una pseudo lingua:

mycar = new Car()
mycar.run()

Ora, si potrebbe desiderare di cambiare il run() il comportamento in volo, mentre il programma è in esecuzione.Per esempio, si potrebbe voler simulare un guasto del motore o l'uso di un "boost" pulsante in un video gioco.

Ci sono diversi modi per fare questo tipo di simulazione:utilizzo di istruzioni condizionali e una variabile di flag è a senso unico.Il modello di strategia è un altro:delega il comportamento del run() metodo di un'altra classe:

Class Car()
{
    this.motor = new Motor(this) 

    // passing "this" is important for the motor so it knows what it is running

    method run()
    {
        this.motor.run()
    }

    method changeMotor(motor)
    {
        this.motor = motor 
    }

}

Se si desidera modificare il comportamento dell'auto, si può solo cambiare il motore.(Più facile in un programma che nella vita reale, giusto?;-) )

E ' molto utile se si hanno un sacco di stati complessi:è possibile modificare e gestire molto più facilmente.

Altri suggerimenti

Problema

Il modello di strategia è usata per risolvere i problemi che potrebbero (o è previsto che potrebbe) essere implementato o risolto con diverse strategie e che possiedono una ben definita interfaccia per tali casi.Ogni strategia è perfettamente valido, con alcune delle strategie che essere preferibile in determinate situazioni, che consentono l'applicazione di passare tra di loro durante il runtime.

Esempio Di Codice

namespace StrategyPatterns
{
  // Interface definition for a Sort algorithm
  public interface ISort
  {
    void Sort(List<string> list)
  }

  // QuickSort implementation
  public class CQuickSorter : ISort
  {
    void Sort(List<string> list)
    {
      // Here will be the actual implementation
    }
  }

  // BubbleSort implementation
  public class CBubbleSort : ISort
  {
    void Sort(List<string> list)
    {
      // The actual implementation of the sort
    }
  }

  // MergeSort implementation
  public class CMergeSort : ISort
  {
    void Sort(List<string> list)
    {
      // Again the real implementation comes here
    }
  }

  public class Context
  {
    private ISort sorter;

    public Context(ISort sorter)
    {
      // We pass to the context the strategy to use
      this.sorter = sorter;
    }

    public ISort Sorter
    {
      get{return sorter;)
    }
  }

  public class MainClass
  {
    static void Main()
    {
       List<string> myList = new List<string>();

       myList.Add("Hello world");
       myList.Add("Another item");
       myList.Add("Item item");

       Context cn = new Context(new CQuickSorter());
       // Sort using the QuickSort strategy
       cn.Sorter.Sort(myList);
       myList.Add("This one goes for the mergesort");
       cn = new Context(new CMergeSort());
       // Sort using the merge sort strategy
       cn.Sorter.Sort(myList);
    }
  }
}
  • Che cosa è una Strategia?Una strategia è un piano di azioni volte a conseguire un obiettivo specifico;
  • “Definire una famiglia di algoritmi, incapsulare ogni uno, e li rendono intercambiabili.Strategia consente all'algoritmo di variare in modo indipendente da clienti che la utilizzano.” (Gang of Four);
  • Specifica un insieme di classi, ognuna delle quali rappresenta un potenziale comportamento.La commutazione tra le classi modifiche l'applicazione di comportamento.(la Strategia);
  • Questo comportamento può essere selezionata in fase di runtime (uso del polimorfismo) o progettazione;
  • Catturare l'astrazione in un'interfaccia, seppellire i dettagli di implementazione delle classi derivate;

enter image description here

  • Un'alternativa alla Strategia è quello di modificare l'applicazione di comportamento utilizzando la logica condizionale.(BAD);
  • Utilizzando questo modello rende più facile per aggiungere o rimuovere un comportamento specifico, senza dover ricodificare e ripetere il test, tutte o in parte l'applicazione;

  • Usi bene:

    • Quando abbiamo un insieme di algoritmi e il suo bisogno di passare tra di loro in diverse parti dell'applicazione.Con il Modello di Strategia è possibile evitare ifs e facilità di manutenzione;
    • Quando si desidera aggiungere nuovi metodi per superclasse che non necessariamente dare un senso ad ogni sottoclasse.Invece di utilizzare un'interfaccia in modo tradizionale, aggiungendo il nuovo metodo, si utilizza una variabile di istanza che è una sottoclasse della nuova Funzionalità di interfaccia.Questo è noto come la Composizione :Invece di ereditare una capacità attraverso l'ereditarietà la classe è composta da Oggetti con la giusta capacità;

Simile modello è il Delegato del modello;in entrambi i casi, una parte del lavoro è passato a qualche altro componente.Se ho capito bene, la differenza tra questi modelli è questo (e per favore mi corregga se sbaglio):

  • Nel Delegato modello, il delegato viene creata un'istanza di inclusione (delega) di classe;questo permette il riutilizzo del codice composizione piuttosto che di ereditarietà.Allegando la classe può essere a conoscenza dei delegati di tipo concreto, ad es.se si richiama il costruttore stesso (piuttosto che in una fabbrica).

  • Nel Strategia modello, il componente che esegue la strategia è una dipendenza fornito di cinta (in uso) componente tramite il suo costruttore, o un setter (secondo la vostra religione).L'utilizzo del componente è totalmente all'oscuro di ciò che la strategia è in uso;la strategia è sempre richiamato tramite un'interfaccia.

Qualcuno sa di eventuali altre differenze?

Direttamente dal Strategia Modello articolo di Wikipedia:

Il modello di strategia è utile per le situazioni in cui è necessario in modo dinamico swap algoritmi utilizzati in un'applicazione.Il modello di strategia è intesa a fornire un mezzo per definire una famiglia di algoritmi, incapsulare ciascuno come un oggetto, e renderle intercambiabili.Il modello di strategia consente di algoritmi variare in modo indipendente da clienti che li utilizzano.

Per aggiungere alla già splendida risposte:Il modello di strategia ha una forte somiglianza con il passaggio di una funzione (o le funzioni) per un'altra funzione.La strategia di questo è fatto avvolgendo detto funzione di un oggetto seguito da passando l'oggetto.Alcune lingue può passare direttamente alle funzioni, e quindi non hanno bisogno del pattern.Ma in altre lingue, non può sfuggire funzioni, ma può passare gli oggetti;il modello si applica.

Soprattutto nei linguaggi Java-like, troverete che il tipo zoo della lingua è piuttosto piccolo e che il solo modo per estendere è la creazione di oggetti.Di conseguenza, la maggior parte delle soluzioni ai problemi è quello di venire con un motivo;un modo per comporre oggetti per raggiungere un obiettivo specifico.Lingue con esperienze di tipo zoo spesso sono più semplici modi di affrontare i problemi-ma più ricchi tipi anche significa che è necessario spendere più tempo a imparare il tipo di sistema.Lingue, con la tipizzazione dinamica disciplina spesso ottiene un subdolo modo per aggirare il problema.

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