2012-11-28 19 views
10

Ho imparato entrambi gli schemi ma non ho compreso le differenze tra questi due modelli.qual è la differenza tra modello di visitatore e strategia?

Non conosco scenari, quando e dove utilizzare questi modelli.

Qualcuno può spiegare le differenze e casi d'uso?

+3

Questo è un buon modo per mettere in relazione i diversi modelli: http://www.cours.polymtl.ca/inf3700/divers/nonSoftwareExample/patexamples.html –

+0

Nice link @ jco.owens!Il collegamento –

+0

è interrotto ora .. puoi aggiornare @ jco.owens? – Joe

risposta

3

Il pattern visitatore viene utilizzato per attraversare la gerarchia degli oggetti e fornire alcune funzionalità come la stampa o la reportistica, ecc. Ho usato questo per fornire diversi formati (Testo/HTML) per stampare una gerarchia di oggetti scrivendo più visitatori, uno per ogni formato . Gli oggetti nella gerarchia sono i visitabili.

Il modello di strategia viene utilizzato per selezionare un particolare percorso logico in base all'input. Un classico esempio sono i filtri di autenticazione dove in base al valore nell'intestazione HTTP Authorization, vengono scelte ed eseguite diverse strategie di autenticazione come NTLM/Negotiate/Basic. Il filtro conterrebbe un riferimento all'interfaccia AuthenticationStrategy, in base alla richiesta in entrata, una particolare strategia di autenticazione viene selezionata e assegnata a questo riferimento e il codice che segue non ha bisogno di conoscere la strategia esatta utilizzata.

+1

un semplice esempio di modello di strategia: utilizzo di diverse implementazioni di Comparator per ordinare un elenco in modo diverso? – Scorpion

15

La differenza principale è che il modello strategia incapsula un singolo gruppo di comportamenti correlati, mentre il modello Visitor racchiude molteplici tali gruppi.

  • è necessario utilizzare il modello strategia quando è necessario incapsulare un comportamento - Se avete una famiglia di algoritmi ed è necessario scegliere tra di loro in fase di esecuzione, è necessario utilizzare modello di strategia. Questo è molto comune: succede ogni volta che si program to an interface.
  • è necessario utilizzare il modello Visitor per implementare doppia spedizione - Se si dispone di un gruppo di algoritmi che devono essere virtuale in relazione a più di un oggetto. Questo è molto meno comune, in parte perché è molto più difficile da implementare.
+2

+1, potresti avere maggiori dettagli con gli esempi ma è una buona risposta concisa e geniale. – Scorpion

+0

@dasblinkenlight Puoi elaborare ciò che intendevi per "Se hai un gruppo di algoritmi che devono essere virtuali in relazione a più di un oggetto". – Geek

+0

@Geek L'esempio classico è rappresentato dagli alberi di espressione. Da un lato, si ha un gruppo di classi che seguono il modello composito (espressione di base, espressione costante, espressione binaria, chiamata di funzione, ecc.) D'altra parte, si ha un gruppo di classi che implementano algoritmi (convertire in XML, stampare in file di testo, valutare, ecc.) Quindi il metodo che si desidera chiamare dipende dal sottotipo dell'espressione ** e ** il sottotipo dell'algoritmo, quindi il comportamento è virtuale rispetto a più di una classe. Il nome ufficiale è [* double dispatch *] (http://en.wikipedia.org/wiki/Double_dispatch). – dasblinkenlight

2

Visitor modello intento:

costituiscono un'operazione da eseguire sugli elementi di una struttura oggetto. Visitor consente di definire una nuova operazione senza modificare le classi degli elementi su cui opera.

modello Uso Visitor se:

  1. operazioni simili devono essere effettuate su oggetti di diverse tipologie raggruppate in una struttura
  2. è necessario eseguire molte operazioni distinte e indipendenti .Si separa Utilizzo di oggetti Struttura
  3. Nuove operazioni devono essere aggiunti senza cambiamento nella struttura degli oggetti
  4. Raccogliere le operazioni correlate in una singola classe piuttosto che la forza di cambiare o derivare classi
  5. Aggiungere funzioni di librerie di classi per il quale si o non si ha il sorgente o non può cambiare la fonte

Anche se Visitor pat tern fornisce la flessibilità per aggiungere nuove operazioni senza modificare il codice esistente in Object, questa flessibilità ha un difetto.

Se è stato aggiunto un nuovo oggetto Visitable, è necessario modificare il codice nelle classi ConcreteVisitor del visitatore &. Esiste una soluzione alternativa per risolvere questo problema: Utilizzare la riflessione, che avrà un impatto sulle prestazioni. per maggiori dettagli

Fare riferimento alla oodesign article e sourcemaking articoli

modello di strategia intento:

Definire una famiglia di algoritmi, incapsulare ciascuno, e renderli intercambiabili. La strategia consente all'algoritmo di variare in modo indipendente dai client che lo utilizzano.

La strategia consente di modificare il coraggio di un oggetto.

riferisca a sotto domande SE per maggiori dettagli:

Real World Example of the Strategy Pattern

0

Oltre alla differenza di comportamento di cui sopra, ho anche sperimentato una differenza per quanto riguarda le dipendenze e casi d'uso nel corso di un progetto di una volta stavo lavorando , come il seguente.

Ad esempio, Visitor conosce le lezioni concrete. Quindi sarai più flessibile a spese della modifica del codice del visitatore mentre aggiungi nuove classi concrete alla gerarchia. Non c'è nulla di simile in Strategia. In questo contesto, la strategia diventa più adatta se hai metodi solo per restituire un output con un dato input, indipendentemente dal contesto.

Inoltre, il pattern Visitor utilizzato anche per implementare SRP di SOLID, per separare le preoccupazioni.

0

Visitatore è per quando si dispone di una famiglia di classi e è necessario aggiungere nuove funzionalità a ogni classe in quella famiglia ma non toccare le classi stesse (o desidera avere quella nuova funzionalità tutte definite in un unico luogo - il visitatore)

Strategia è per quando si dispone di una famiglia di classi che devono essere in grado di fare qualcosa per funzionare correttamente (come ordinare alcuni oggetti che contengono) ma si desidera che il client o l'iniezione di dipendenza in dì loro quale strada seguire per farlo.