Modello di comando: client e Invoker
-
23-08-2019 - |
Domanda
Nel modello di comando:
Perché non dovrebbe partecipante cliente essere la stessa classe del partecipante invoca? C'è possibili scenari in cui il partecipante client e il partecipante invoker può essere la stessa classe?
Soluzione
Il più grande motivo è che viola il principio singolo responsiblity. Il partecipante Cliente e Invoker particpant entrambi hanno individuali responsibilties e una modifica a uno interesserà l'altro.
Altri suggerimenti
1) la responsabilità principale per il client è quello di una corretta instanciation di Invoker, ricevitore e gli oggetti Command e quindi avviare procedura di esecuzione in luogo e di tempo adeguato.
Si potrebbe, per esempio, essere qualcosa di simile
class Client {
...
invoker.executeCommand()
...
}
2) la responsabilità principale di Invoker è invocare uno o più comandi-metodi di Command oggetto in ordine particolare.
Ad esempio,
class Invoker {
...
command.command1();
command.command2();
command.command3();
...
}
Si consideri, ad esempio, la classe java.awt.event.KeyListener. Ha tre metodi che è invocata nella seguente ordine:
keyPressed(KeyEvent e)
keyTyped(KeyEvent e)
keyReleased(KeyEvent e)
class Invoker per questo ascoltatore potrebbe essere:
class KeyInvocation {
KeyListener listener;
void invokeKey(EventObject e) {
listener.keyPressed(e);
listener.keyTyped(e);
listener.keyReleased(e);
}
}
Classe Nel frattempo client dovrebbe corretta instanciate EventObject, KeyListener e KeyInvocation e quindi eseguire nella corretta metodo invokeKey luogo e tempo.
Naturalmente Invoker è uno strato aggiuntivo di modello di comando. Nel caso più semplice del modello di comando possiamo saltare classe Invoker a tutti e fare tutto il lavoro in un client.