Command pattern può essere utilizzato per implementare Transactional behavior
(e Undo
).
Ma non ho potuto trovare un esempio di questi con Google. Ho potuto trovare solo alcuni esempi banali di una lampada che è switched on
o off
.
Dove posso trovare un esempio di codifica (preferibilmente in Java
) di questi/questi comportamenti implementati utilizzando lo Command Pattern
?Esempio di applicazione reale del modello di comando
risposta
In uno dei nostri progetti, abbiamo il seguente requisito:
- creare un record nel DB.
- Chiama un servizio per aggiornare un record correlato.
- Chiamare un altro servizio per registrare un ticket.
Per eseguire questa operazione in modo transazionale, ciascuna operazione viene implementata come comando con un'operazione di annullamento. Alla fine di ogni fase, il comando viene inserito in una pila. Se l'operazione fallisce in qualche momento, quindi inseriamo i comandi dallo stack e richiamiamo l'operazione di annullamento su ciascun comando saltato fuori. L'operazione di annullamento di ogni passaggio è definita nell'implementazione del comando per invertire il comando precedente.execute().
Spero che questo aiuti.
public final class Ping implements Callable<Boolean> {
private final InetAddress peer;
public Ping(final InetAddress peer) {
this.peer = peer;
}
public Boolean call() {
/* do the ping */
...
}
}
...
final Future<Boolean> result
= executorService.submit(new Ping(InetAddress.getByName("google.com")));
System.out.println("google.com is " + (result.get() ? "UP" : "DOWN"));
Che cos'è questo esempio? – Jim
@Jim l'articolo di Wikipedia sullo schema menziona esplicitamente quanto segue ... "* Una tipica classe del pool di thread generico potrebbe avere un metodo pubblico' addTask' che aggiunge un elemento di lavoro a una coda interna di attività in attesa di essere eseguite ... Gli oggetti in coda sono oggetti di comando: in genere questi oggetti implementano un'interfaccia comune come 'java.lang.Runnable' che consente al pool di thread di eseguire il comando anche se la classe del pool di thread è stata scritta senza alcuna conoscenza delle attività specifiche per le quali verrebbe utilizzato. * " – oldrinb
@Jim questo è un tale esempio in Java tranne che per l'uso di" Callable "anziché di" Runnable "in concomitanza con un [ExecutorService'] (http: // docs. oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html). Un simile esempio può essere visto nella discussione riguardante l'articolo di Wikipedia stesso [qui] (http://en.wikipedia.org/wiki/Talk%3ACommand_pattern#Python_examples). – oldrinb
I pattern di comando sono utilizzati in molti posti.
- Ovviamente quello che vedi ovunque è un esempio molto banale di implementazione della GUI, switch. È anche ampiamente utilizzato per lo sviluppo del gioco. Con questo modello l'utente può configurare i suoi pulsanti anche sullo schermo.
- Viene utilizzato anche in rete, se un comando deve essere passato all'altro capo.
- Quando i programmatori desiderano memorizzare tutti i comandi eseguiti dall'utente, ad es. a volte un gioco ti consente di riprodurre l'intero livello.
- Viene utilizzato per implementare le richiamate.
Questo è un sito che fornisce come esempio del modello di comando utilizzato per il callback. http://www.javaworld.com/article/2077569/core-java/java-tip-68--learn-how-to-implement-the-command-pattern-in-java.html?page=2
- Ecco un altro collegamento che mostra lo schema di comando con il database. Il codice è in C#. http://www.codeproject.com/Articles/154606/Command-Pattern-at-Work-in-a-Database-Application
You have to define undo(), redo() operations along with execute() in Command interface itself
.
esempio:
interface ChangeI {
enum State{ READY, DONE, UNDONE, STUCK } ;
State getState() ;
void execute() ;
void undo() ;
void redo() ;
}
Definire uno Stato nella classe ConcreteCommand
. A seconda dello stato corrente dopo il metodo execute
(), è necessario decidere se il comando deve essere aggiunto a Undo Stack
o Redo Stack
e prendere la decisione di conseguenza.
abstract class AbstractChange implements ChangeI {
State state = State.READY ;
public State getState() { return state ; }
public void execute() {
assert state == State.READY ;
try { doHook() ; state = State.DONE ; }
catch(Failure e) { state = State.STUCK ; }
catch(Throwable e) { assert false ; }
}
public void undo() {
assert state == State.DONE ; }
try { undoHook() ; state = State.UNDONE ; }
catch(Failure e) { state = State.STUCK ; }
catch(Throwable e) { assert false ; }
}
public void redo() {
assert state == State.UNDONE ;
try { redoHook() ; state = State.DONE ; }
catch(Failure e) { state = State.STUCK ; }
catch(Throwable e) { assert false ; }
}
protected abstract void doHook() throws Failure ;
protected abstract void undoHook() throws Failure ;
protected void redoHook() throws Failure { doHook() ;} ;
}
Date un'occhiata a questo articolo undo-redo comando per una migliore comprensione.
- 1. Evitare il modello di dominio anemico - un esempio reale
- 2. C# 4: Esempio di tipi dinamici del mondo reale
- 3. Kohana applicazione di esempio CRUD
- 4. Nome reale del modello "container_of"
- 5. nHibernate + applicazione di esempio Mvc3
- 6. Esempio di mondo reale di Paxos
- 7. Applicazione del mondo reale di conversione allargamento/restringimento?
- 8. Esempio reale di eventi in Yii2
- 9. Esempio di applicazione di FasterCSV
- 10. Esempio reale di unificazione nella logica del primo ordine?
- 11. Comando oggetto modello wannabe o la cosa reale?
- 12. ReRegisterForFinalize SuppressFinalize esempio di vita reale
- 13. Contravarianza scala - esempio di vita reale
- 14. Bash: modello di grep dall'output del comando
- 15. JAXB @XmlAttribute @XmlValue esempio reale
- 16. Esempio di mondo reale di GraphQLInterfaceType e GraphQLUnionType
- 17. Git Unisci ricorsivo - Esempio di sintassi del comando
- 18. Esempio di applicazione aziendale per ASP.NET MVC?
- 19. esempio di applicazione che utilizza vaadin
- 20. Esempio di applicazione .net tramite Amazon SQS
- 21. Esempio di applicazione MS per ASP.NET MVC?
- 22. Esempio di applicazione WorldWind incontra AbstractMethodError all'avvio
- 23. Esempio di Windows Identity Foundation applicazione MVC
- 24. Questo è davvero un esempio del modello di adattatore?
- 25. Esempio di vita reale per errore in virgola mobile
- 26. Applicazione di compravendita di azioni multithread in tempo reale WPF
- 27. qual è lo scopo del nome del comando e dell'argomento del comando per un pulsante di esempio di controllo?
- 28. Filosofia di apprendimento automatico: applicazione del modello a dati distorti
- 29. Applicazione del descrittore di ordinamento a NSFetchRequest creato dal modello
- 30. biblioteca FEM per tempo reale applicazione
Non sono sicuro che io segua. Una transazione è rollbackback.Non è composta da operazioni di annullamento. Come hai implementato la parte atomica con lo schema di comando? – Jim
In una transazione a livello di database, ogni operazione è un comando con operazioni di annullamento e ripetizione. Al momento del rollback, il DBMS chiamerà l'operazione di annullamento per annullare le modifiche apportate alla copia del DB che contiene. Stiamo simulando la stessa cosa in una transazione distribuita che si estende su tutti i sistemi. Ha senso ora? – Vikdor
'ripristina le modifiche apportate alla copia del DB in esso trattenuto. Quindi il comando si applica prima a una copia dei dati e non ai dati effettivi? Ho pensato che fosse applicato direttamente ai dati, motivo per cui è necessario" annullare ". La tua descrizione è abbastanza chiara ma ho bisogno di dettagli un po 'più bassi, se possibile per vedere l'immagine grande – Jim