UGIdotNET Home UGIdotNET Home
UGIdotNET Blogs UGIdotNET Blogs
UGIdotNET Forum UGIdotNET Forum
MSDN Architetti MSDN Architetti
Visualizza Modifiche Visualizza Modifiche
Modifica Modifica
Stampa Stampa
Modifiche Recenti Modifiche Recenti
Sottoscrizioni Sottoscrizioni
Ufficio Oggetti Smarriti Ufficio Oggetti Smarriti
Cerca Riferimenti Cerca Riferimenti
Rinomina Rinomina
Cerca

Versioni

25/12/2005 14.29.48
LucaMinudel-151.47.144.232
25/12/2005 13.18.20
LucaMinudel-151.47.144.232
25/12/2005 13.18.05
LucaMinudel-151.47.144.232
25/12/2005 13.17.19
LucaMinudel-151.47.144.232
21/12/2005 22.49.39
LucaMinudel-151.47.132.13
Elenco completo versioni Elenco completo versioni
Pattern Command
.
Summary Un design pattern che inserisce un comando ed i suoi parametri in un oggetto che può essere trasmesso, accodato, annullato o posticipato.

Conosciuto anche come

Action, Transaction, Object version of closure.

Intento

Il design pattern Command permette (alla classe Client) di incapsulate una richiesta, ossia un comando (Execute) da eseguire ed i suoi parametri (state), sotto forma di oggetto (ConcreteCommand) da usare per parametrizzare il comportamento di altri oggetti (Invoker) con diverse richieste (ossia con diversi oggetti ConcreteCommand), code di richieste oppure log di richieste.

Il comando ossia la classe ConcreteCommand da istanziare e il suo state vengono determinati a run-time quindi questo design pattern è classificato rispetto allo scopo (vedi ClassificazioneDeiDesignPattern#ClassiOggetti) come rivolto alle classi/agli oggetti. Rispetto al fine questo questo design pattern è classificato tra i ClassificazioneDeiDesignPattern#Comportamentali .

Diagramma UML

Un'altro diagramma equivalente qui .

Motivazione

A volte è preferibile che l'oggetto che esegue il comando (la classe Invoker) non abbia bisogno di conoscere i dettagli del comando (l'implementazione del metodo Execute e lo state di tipo Receiver) da eseguire o debba eseguire un comando scelto da un altro oggetto (la classe Client). Il design pattern Command permette di disaccoppiare l'esecuzione del comando dalla scelta e conoscenza del comando da eseguire tra 2 oggetti diversi. L'uso del Command permette inoltre di trasmettere remotamente un comando e posticipare l'esecuzione e supporta l'accodamento più comandi, l'accorpamento di più comandi in un'unica transazione, il log dei comandi in modo che possano essere rieseguiti in caso di crash e l'undo e redo dei comandi.

Esempi d'uso in .NET

Un esempio di applicazione del design pattern Command molto usato in .NET è il ConcreteCommand SqlCommand derivato IDbCommand il cui state sono i comandi SQL e relativi parametri.

Un esempio di applicazione del design pattern in cui più comandi sono accorpati è SqlDataAdapter che accorpa i comandi di select, update e delete e al pocto di Execute ha Fill e Update. Tuttavia se il codice che esegue Update può ignorare l'istanza del db e i comandi sql deve invece saper gestire gli eventuali errori.

Note sulla implementazione in .NET

Qualora il comando venga trasmesso tra application domain distinti entra in gioco la serializzazione e il remoting.

Pe raggruppare più comandi in un'unica transazione possono essere d'aiuto le funzioni messe a disposizione da System.Transactions .

Il Delegate ha alcune similitudini col Command.

Del codice .NET di esempio è disponibile qui .

Relazione con altri design pattern

Si può ottenere un accorpamento di più comandi applicando il PatternComposite. La funzione di undo può essere usata applicando il PatternMemento. Quando viene fatto il log dei Command eseguiti, il Command si comporta nella copia come il PatternPrototype.

Vedi la mappa della RelazioneTraDesignPattern.

Approfondimenti

Quando un Command può sollevare eccezioni va considerato attentamente la responsabilità dei Invoker nel capire e gestire queste eccezioni.

Al posto dell'ereditarietà con C# 2.0 è possibile usare i generics per creare diversi ConcreteCommand.

Domande di approfondimento

  • Che similitudini ci sono tra il PatternObserver e il Command?
  • Che differenza c'è tra PatternObserver e Command?
  • Come garantire la possibilità di estendere il comando lasciando che questo abbia accesso alle informazioni (parametri) necessarie per poter essere eseguito?

Link

VediAnche CatalogoDeiDesignPattern,DesignPattern#PatternComuni

UGIdotNETWiki

UGIdotNETWiki è il WikiWiki italiano dedicato a .NET

Se è la prima volta che senti parlare di Wiki, leggi il BenvenutoAiVisitatori e WikiInUnMinuto, oppure il ManualePassoPassoDelWiki.

Argomenti Recenti

  • PatternCommand
© 2008 User Group Italiano UGIdotNET. Tutti i diritti riservati. Note legali