2012-08-28 13 views
11

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

11

In uno dei nostri progetti, abbiamo il seguente requisito:

  1. creare un record nel DB.
  2. Chiama un servizio per aggiornare un record correlato.
  3. 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.

+0

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

+0

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

+0

'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

2
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")); 
+5

Che cos'è questo esempio? – Jim

+0

@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

+0

@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

1

I pattern di comando sono utilizzati in molti posti.

  1. 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.
  2. Viene utilizzato anche in rete, se un comando deve essere passato all'altro capo.
  3. Quando i programmatori desiderano memorizzare tutti i comandi eseguiti dall'utente, ad es. a volte un gioco ti consente di riprodurre l'intero livello.
  4. 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

  1. 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
0

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.

Problemi correlati