Versioni
| Conosciuto anche comeAction, Transaction, Object version of closure. IntentoIl 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 . MotivazioneA 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 .NETUn 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 .NETQualora 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 patternSi 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. ApprofondimentiQuando 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
Link
| UGIdotNETWikiUGIdotNETWiki è 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 | ||||||||||||||||||||||||||||||||||||||
| © 2008 User Group Italiano UGIdotNET. Tutti i diritti riservati. Note legali | ||||||||||||||||||||||||||||||||||||||||