2010-12-13 43 views
8

Dans mon application, je souhaite offrir à l'utilisateur une petite fonctionnalité d'annulation. Il n'y a pas beaucoup d'actions qui peuvent être annulées par l'utilisateur. En particulier, les actions sont:Comment implémenter la fonctionnalité d'annulation?

  • Ajouter des notes à un objet
  • couleur d'un objet
  • Tag a objcet avec une chaîne

Maintenant, je pensais que sur la façon de mettre en œuvre. J'ai d'abord pensé à une classe d'action qui est la classe de base abstraite pour les 3 actions différentes qui peuvent être prises par l'utilisateur. Chaque fois que l'utilisateur entreprend ces actions, une nouvelle instance appropriée d'une sous-classe de cette classe Action abstraite est créée et insérée dans une liste qui contient toutes les actions.

Chaque fois que l'utilisateur veut annuler quelque chose, la liste est affichée à l'utilisateur et il peut choisir quelle action il veut annuler.

Maintenant, je pensais ce que doit être stocké dans un tel objet d'action:

  • l'état de l'objet avant que l'action
  • l'action réelle qui a été prise (par exemple, la chaîne qui a été ajouté à notes d'un objet)

Je ne sais pas si c'est suffisant. J'ai aussi pensé à quelque chose comme un ordre chronologique, mais cela devrait être nécessaire puisque la liste peut être maintenue chronologiquement correcte.

Y a-t-il d'autres choses que je devrais considérer?

+1

Recherche pour le motif de memento dans GOF – pastjean

+2

ou modèle de commande – slayerIQ

+1

Voir aussi ici: http://stackoverflow.com/questions/49755/design-pattern-for-undo-engine –

Répondre

14

Undo/Redo est généralement i Mplémenté avec le Command Pattern. La classe Action peut être utilisée comme base pour cela, mais vous avez besoin d'une action «faire» et d'une action «Annuler» dans chaque commande. Here is an example dans la pratique. Vous devriez probablement stocker les commandes exécutées dans une pile, car elles sont beaucoup plus faciles à mettre en œuvre et beaucoup plus faciles à suivre pour l'utilisateur.

2

Tout semble correct, mais je préfère utiliser la pile que la liste. Cela sera utile dans l'ordre chronologique.

2

Pour implememtation correcte et éprouvée pour la fonctionnalité UNDO est commande modèle

9

Vous pourriez faire quelque chose de simple comme ceci:

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

J'aime celui-ci. N'a jamais pensé à stocker des actions réelles ... très agréable. – Crisfole