Domanda

Sono in una classe dove abbiamo appena appreso, su questi modelli di progettazione. Tuttavia, non ho potuto vedere alcuna differenza tra di loro. Suonano come lo stesso, la creazione di classi concrete su quello astratto. Qualcuno potrebbe aiuto uccidermi questo dubbio? grazie (:

È stato utile?

Soluzione

Sia il visitatore, la strategia, e il motivo template comprendono l'applicazione di un algoritmo. La più grande differenza è nel modo in cui vengono evocati e come essi vengono utilizzati nella pratica. Anche se può sembrare come hanno lo stesso caso d'uso, sguardo alla costruzione degli oggetti per vedere la differenza.

Il modello di strategia viene spesso usato quando non abbiamo la capacità di passare intorno alle funzioni come un oggetto di prima classe. Si aspetta un elenco di argomenti molto specifici e solo quella lista degli argomenti nel suo modello di chiamata. Per esempio:

struct MyStrat{
    void operator()(const Foo &_input){
        _input.up( 2 );
    }
};

std::for_each( myFooList.begin(), myFooList.end(), MyStrat() );

che viene poi applicata ad un elenco di oggetti di tipo "Foo". Veramente non abbiamo altro modo di applicare a qualsiasi altro oggetto.

Il modello visitatore d'altra parte viene utilizzata quando si vuole applicare un algoritmo per un gruppo di oggetti che potrebbero non condividere la stessa firma, né hanno le stesse funzioni membro. Diciamo modello visitatore perché è spesso usato quando attraversano un albero o un'altra raccolta di oggetti "estranei" (non collegati in senso eredità.)

struct MyVisitor{
    void visit(const Foo &_input){
         _input.up( 2 );
    }
    void visit(const Bar &_input){
         _input.raiseUp( 2 );
    }
    void visit(const Baz &_input){
         _input.setUp( 2 );
    }
 };

Qui, l'idea è che vorremmo "su" tutti questi oggetti. Tutti non condividono la stessa firma funzione membro, ma tutti sono concettualmente legati. Quindi, siamo in grado di "visita" ciascuna di queste classi, ma si aspettano l'algoritmo per eseguire lo stesso tipo di operazione.

Utilizzando un modello visitatore abbiamo evitare la necessità di avvolgere ogni classe in un modello di delega. Quindi, per le classi N vorremmo applicare questo algoritmo non abbiamo bisogno di fare N classi proxy. Abbiamo solo bisogno di aggiungere metodi N a una classe visitatore.

Il metodo modello è molto diverso sia dal visitatore e il modello di strategia. Con il modello di quello che stai cercando di fare è far rispettare lo stesso tipo di algoritmo, ma su diverse sottoclassi all'interno di una gerarchia. Per esempio:

class Duck{
public:
    int count() =0;
    void makeNoise(int times) =0;
    void quack(){ makeNoise( count() ); }//the template pattern is here
};

class Mallard : public Duck{
public:
    int count(){ return 4; }
    void makeNoise( cout << "quack" << endl; }
};

class Daffy{
public:
    int count(){ return 1; }
    void makeNoise( cout << "Why I ought to..." << endl; }
};

Così il risultato dell'algoritmo varia all'interno della gerarchia.

Altri suggerimenti

comunanze:

  1. Strategia, Template Method e Visitor :. Tutti e tre i modelli sono classificati come modelli comportamentali

Differenze:

  1. metodo Template utilizza Ereditarietà e Strategia utilizza composizione
  2. Il metodo Template implementato dalla classe di base non deve essere ignorato. In questo modo, la struttura dell'algoritmo è controllato dalla classe super, ei dettagli sono implementate nelle classi Sub
  3. Strategia incapsula l'algoritmo dietro un'interfaccia, che ci forniscono la capacità di modificare l'algoritmo in fase di esecuzione
  4. Pro modello viene utilizzato per eseguire un'operazione su un gruppo di simile tipo di oggetti. Con l'aiuto del modello visitatore, siamo in grado di spostare la logica di funzionamento dagli oggetti di un'altra classe
  5. Se c'è un cambiamento nella realizzazione di funzionamento, dobbiamo solo cambiare Visitor di classe invece di toccare tutti gli altri oggetti.

Date un'occhiata al Template metodo , strategia e Visitor e Sourcemaking articoli per una migliore comprensione.

Related posts:

Quando devo usare il pattern Visitor Design?

Real World Esempio della strategia pattern

Template design pattern in JDK, non riusciva a trovare un metodo che definisce insieme di metodi da eseguire al fine

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