2010-12-13 7 views
8

Nella mia applicazione voglio fornire all'utente una piccola funzionalità di annullamento. Non ci sono molte azioni che possono essere annullate dall'utente. In particolare le azioni sono:Come implementare la funzionalità di annullamento?

  • aggiungere note a un oggetto
  • colori di un oggetto
  • Tag un objcet con una stringa

Ora ho pensato a come implementare questa. Per prima cosa ho pensato ad una Action Class che è la classe base astratta per le 3 diverse azioni che possono essere intraprese dall'utente. Ogni volta che l'utente intraprende queste azioni, viene creata una nuova istanza appropriata di una sottoclasse di questa classe Action astratta che viene inserita in un elenco che contiene tutte le azioni.

Ogni volta che l'utente desidera annullare qualcosa, l'elenco viene visualizzato all'utente e può scegliere l'azione che desidera annullare.

Ora stavo pensando che cosa deve essere conservato in un tale oggetto di azione:

  • lo stato dell'oggetto prima che l'azione
  • l'azione reale che è stata presa (per esempio, la stringa che è stato aggiunto a note di un oggetto)

Non sono sicuro se questo è sufficiente. Ho anche pensato a qualcosa come un ordinamento cronologico, ma questo dovrebbe essere necessario poiché l'elenco può essere mantenuto cronologicamente corretto.

Ci sono altre cose che dovrei considerare?

+1

Cerca il motivo di memento in GOF – pastjean

+2

o modello di comando – slayerIQ

+1

Vedere anche qui: http://stackoverflow.com/questions/49755/design-pattern-for-undo-engine –

risposta

14

Undo/redo comunemente è i implementato con lo Command Pattern. La classe Action può essere utilizzata come base per questo, ma è necessario un'azione "fai" e un'azione "annulla" all'interno di ciascun comando. Here is an example di questo in pratica. Probabilmente dovresti memorizzare i comandi eseguiti in una pila in quanto rende molto più facile da implementare e molto più semplice da seguire per l'utente.

2

Tutto sembra corretto, ma preferisco usare lo stack piuttosto che l'elenco. Sarà utile nell'aspetto dell'ordine cronologico.

2

per una corretta e comprovata implememtation per la funzionalità Undo è Command pattern

9

Si potrebbe fare qualcosa di semplice come questo:

Stack<Action> undoStack = new Stack<Action>();  

void ChangeColor(Color color) 
{ 
    var original = this.Object.Color; 
    undoStack.Push(() => this.Object.Color = original); 
    this.Object.Color = color; 
} 
+0

Mi piace questo. Non avevo mai pensato di immagazzinare azioni reali ... molto bello. – Crisfole