Domanda

Entrambi i modelli di progettazione incapsulano un algoritmo e disaccoppiano i dettagli di implementazione dalle classi chiamanti.L'unica differenza che riesco a distinguere è che il modello Strategia accetta parametri per l'esecuzione, mentre il modello Comando no.

Mi sembra che il pattern di comando richieda che tutte le informazioni per l'esecuzione siano disponibili al momento della creazione ed è in grado di ritardarne la chiamata (magari come parte di uno script).

Quali determinazioni guidano se utilizzare un modello o l’altro?

È stato utile?

Soluzione

Sono tra cui un tavolo gerarchia di incapsulamento di alcuni dei design pattern GoF per aiutare a spiegare le differenze tra questi due modelli. Speriamo che illustra meglio ciò che ogni incapsula quindi la mia spiegazione rende più senso.

Prima di tutto, le liste gerarchia scopi per i quali un dato modello è applicabile, o il modello appropriato da utilizzare per incapsulare un certo livello di dettaglio, a seconda di quale parte del tavolo che si avvia a.

disegno del modello incapsulamento tavolo gerarchia

Come si può vedere dalla tabella, una strategia modello oggetto nasconde i dettagli di implementazione di un algoritmo, quindi l'uso di un oggetto diversa strategia eseguirà le stesse funzionalità, ma in un modo diverso. Ogni oggetto strategia potrebbe essere ottimizzato per un determinato fattore o operare su qualche altro parametro; e, attraverso l'utilizzo di un'interfaccia comune, il contesto può funzionare sicuro con entrambi.

Il modello di comando incapsula un livello molto più piccolo dei dettagli di un algoritmo. Essa codifica i dettagli necessari per inviare un messaggio a un oggetto: il ricevitore, il selettore e gli argomenti. Il vantaggio per oggettivanti una parte minuscola della esecuzione del processo è che tali messaggi possono essere richiamati insieme diversi punti di tempo o di posizione in modo generale, senza dover codificare i suoi dettagli. Permette messaggi da invocare una o più volte, o passate a diverse parti del sistema o più sistemi senza richiedere i dettagli di una specifica invocazione da conoscere prima dell'esecuzione.

Come è tipico per modelli di progettazione, non richiedono tutte le implementazioni essere identici in dettaglio per portare il nome del modello. I dettagli possono variare in attuazione e in quali dati vengono codificati in oggetto rispetto a come argomenti di metodo.

Altri suggerimenti

algoritmi di incapsulare

strategie. Comandi separano il mittente dal ricevitore di una richiesta, si trasformano una richiesta in un oggetto.

Se si tratta di un algoritmo, come verrà fatto qualcosa, utilizzare una strategia. Se è necessario separare la chiamata di un metodo per il suo utilizzo l'esecuzione di un comando. I comandi sono spesso utilizzati quando si coda dei messaggi per un uso successivo, un compito o di una transazione.

Rispondere a una domanda molto vecchia.(qualcuno vede le risposte più recenti invece di quelle più votate?)

È una confusione valida da avere a causa delle somiglianze.Utilizzano sia i modelli di strategia che quelli di comando incapsulamento.Ma questo non li rende uguali.

La differenza fondamentale è capire Che cosa è incapsulato.Il principio OO, da cui dipendono entrambi i modelli, lo è Incapsula ciò che varia.

In caso di strategia, ciò che varia è algoritmo.Ad esempio, un oggetto strategia sa come eseguire l'output in un file XML, mentre l'altro esegue l'output, ad esempio, in JSON.Vengono mantenuti diversi algoritmi (incapsulato) in classi diverse.È così semplice.

In caso di comando ciò che varia è il richiesta si.La richiesta potrebbe provenire da File Menu > Delete O Right Click > Context Menu > Delete O Just Delete Button pressed.Tutti e tre i casi possono generare 3 oggetti comando dello stesso tipo.Questi oggetti comando rappresentano solo 3 richieste di cancellazione;non algoritmo di cancellazione.Poiché le richieste ora sono un mucchio di oggetti, potremmo gestirle facilmente.All'improvviso diventa banale fornire funzionalità come annullare o ripetere.

Non importa in che modo il comando implementa la logica richiesta.Chiamando esecuzione(), può implementare un algoritmo per attivare la cancellazione o può anche delegarla ad altri oggetti, o addirittura delegare a una strategia.È solo il dettaglio di implementazione del modello di comando.Questo è il motivo per cui è chiamato come comando anche se non è un modo educato per farlo richiesta :--)

Contrastalo con la strategia;questo modello riguarda solo la realtà logica che viene eseguito.Se lo facciamo, aiuta a ottenere diverse combinazioni di comportamenti con un insieme minimo di classi, prevenendo così l’esplosione delle classi.

Penso che Command ci aiuti ad ampliare la nostra comprensione dell'incapsulamento mentre Strategy fornisce un uso naturale dell'incapsulamento e del polimorfismo.

Il modo in cui io guardo è che si dispone di più modi di fare la stessa cosa, ognuno di questi è una strategia, e qualcosa a runtime determina che viene eseguito strategia.

Forse primo tentativo StrategyOne, se i risultati non sono abbastanza buone, provate StrategyTwo ...

I comandi sono tenuti a cose distinte che devono accadere come TryToWalkAcrossTheRoomCommand. Questo comando sarà licenziato ogni volta che un oggetto deve cercare di camminare per la stanza, ma al suo interno, si potrebbe provare StrategyOne e StrategyTwo per aver tentato di camminare per la stanza.

Mark

I potrebbe essere sbagliato, a mio parere, ma io trattare il comando come la funzione-to eseguire, o reazione. Non ci dovrebbero essere almeno due giocatori: quello che richiede l'azione, e colui che esegue l'azione. GUI è tipico esempio di modello di comando:

  • Tutti i pulsanti sulla barra degli strumenti dell'applicazione sono associati con una certa azione.
  • Button è l'esecutore in questo caso.
  • Azione è il comando in questo caso.

Il comando è di solito limitato a qualche ambito o settore commerciale, ma non è necessario: si possono avere i comandi che emettono una fattura, avviare un razzo o rimuovere un file attuare la stessa interfaccia (metodo execute() esempio singolo) all'interno di un'unica applicazione. Spesso i comandi sono auto-contenente, quindi non hanno bisogno di qualsiasi cosa, da l'esecutore per elaborare l'operazione sono intendono (tutte le informazioni necessarie è dato al momento di costruzione), a volte i comandi sono sensibili al contesto e dovrebbero essere in grado di scoprire questo contesto ( Backspace comando deve conoscere la posizione del cursore nel testo correttamente rimuovere il carattere precedente; Ripristina di comando dovrebbe scoprire la transazione corrente di rollback; ...).

Il strategia è un po 'diversa: è più legato ad una certa zona. La strategia può definire una regola per formattare una data (in UTC? Specifiche locali?) ( "Data di formattatore" strategia) o per calcolare una piazza per una figura geometrica (strategia "piazza calcolatrice"). Le strategie sono in questo senso gli oggetti peso mosca, che prende qualcosa come input ( "data", "figura", ...) e fare qualche decisione sulla sua base. Forse non la migliore, ma buon esempio di strategia è quella collegata con l'interfaccia javax.xml.transform.Source: a seconda che l'oggetto passato è DOMSource o SAXSource o StreamSource strategia (= XSLT trasformatore in questo caso) si applicherà regole diverse da elaborare esso. L'implementazione può essere un semplice switch o coinvolgere catena del modello di responsabilità .

Ma in effetti c'è qualcosa in comune tra questi due modelli:. Comandi e le strategie incapsulano algoritmi all'interno della stessa area semantica

Comando:

Componenti di base:

  1. Comando dichiara un'interfaccia per comandi astratti come execute()
  2. Ricevitore sa come eseguire un particolare comando
  3. Invocatore tiene ConcreteCommand, che deve essere eseguito
  4. Cliente crea ConcreteCommand e assegnare Ricevitore
  5. ConcreteCommand definisce il legame tra Comando E Ricevitore

Flusso di lavoro:

Cliente chiamate Invocatore => Invocatore chiamate ConcreteCommand => ConcreteCommand chiamate Ricevitore metodo, che implementa abstract Comando metodo.

Vantaggio :Il client non subisce modifiche in Command e Receiver.L'Invoker fornisce un accoppiamento libero tra Client e Ricevente.Puoi eseguire più comandi con lo stesso Invoker.

Comando pattern ti consente di eseguire un comando su diversi Ricevitori utilizzando lo stesso Invocatore.L'invoker non è a conoscenza del tipo di Ricevitore

Per una migliore comprensione dei concetti, dai un'occhiata a questo JournalDev articolo di Pankaj Kumar e zona d articolo di James Sugrue oltre al collegamento a Wikipedia.

Puoi usare Comando modello a

  1. Disaccoppiare l'invocatore e il destinatario del comando

  2. Implementare il meccanismo di callback

  3. Implementare la funzionalità di annullamento e ripetizione

  4. Mantieni una cronologia dei comandi

java.lang.Thread è una buona implementazione di Comando modello.Puoi trattare Filo come invocatore e implementazione della classe Percorribile COME Comunicazione/ricevitore in calcestruzzo E run() metodo come Comando.

La versione Annulla/Ripeti del modello di comando può essere letta in Quella di Theodore Norvell articolo

Strategia:

Il modello di strategia è molto semplice da capire.Usa questo modello quando

Sono disponibili più implementazioni per un algoritmo e l'implementazione dell'algoritmo può cambiare in fase di esecuzione a seconda di condizioni particolari.

Prendiamo un esempio di Componente tariffario del sistema di prenotazione della compagnia aerea

Le compagnie aeree vorrebbero offrire tariffe diverse durante periodi di tempo diversi: mesi di alta e bassa punta.Nei giorni di bassa stagione vorrebbe stimolare la domanda offrendo sconti interessanti.

Punti chiave di Strategia modello:

  1. È un modello comportamentale
  2. Si basa sulla delega
  3. Cambia l'essenza dell'oggetto modificando il comportamento del metodo
  4. Viene utilizzato per passare da una famiglia di algoritmi all'altra
  5. Modifica il comportamento dell'oggetto in fase di esecuzione

Post correlati con esempi di codice:

Utilizzando il modello di progettazione dei comandi

Esempio nel mondo reale del modello strategico

Per me, la differenza è uno di intenti. Le implementazioni di entrambi i modelli sono abbastanza simili, ma hanno diversi scopi:

  • Per una strategia, il componente utilizzando l'oggetto sa cosa l'oggetto fa (e lo userà per eseguire una parte del proprio lavoro), ma non si preoccupa come lo fa.

  • Per un comando, la componente utilizzando l'oggetto non conosce né che cosa fa il Comando né come lo fa - si sa bene come richiamare esso. Il compito del chiamante è solo quello di eseguire il comando -. la trasformazione eseguita dal Comando non fa parte del lavoro di base del chiamante

Questa è la differenza - fa l'oggetto utilizzando il componente in realtà sapere o cura di ciò che la componente fa? Il più delle volte questo può essere determinato a seconda che il modello oggetto restituisce un valore alla sua invoker. Se le cure invoker su ciò che il modello oggetto fa allora probabilmente vorranno per tornare qualcosa e sarà una strategia. Se non si preoccupa di alcun valore di ritorno è probabilmente un comando (nota, qualcosa di simile a un Callable Java è ancora un comando perché, anche se si restituisce un valore, il chiamante non si preoccupa il valore - semplicemente passa indietro a tutto ciò che originariamente forniti Command).

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