2011-07-01 1 views
2

Je commence à implémenter le modèle de commande dans l'espoir d'obtenir une solution utile à mon problème de fournir une opération d'annulation. Maintenant, je suis confronté à un certain problème:Implémentation d'annulation en Java pour les changements d'état

L'exécution d'annulation lorsque les opérations sont impliquées est plutôt facile: quand j'ai ajouté 5 à un nombre, alors je soustrais 5. Quand j'ai ajouté un objet à une liste, alors je retire ça, et ainsi de suite. Mais que faire si j'ai un état total et pas quelque chose comme une liste?

Un exemple: je modélise des informations sur un fil dans une classe:

public class ThreadInfo implements Comparable<ThreadInfo> { 

    final int id; 
    String name; 
    int priority; 
    String state; 
    int waitCount; 
    // ... 
} 

Certaines informations ne change pas, par exemple l'id. Il est facile de défaire le waitCount comme décrit ci-dessus, il suffit de le soustraire. Mais qu'en est-il priority ou state? Il n'est pas clair comment annuler ces informations.

La seule idée je suis venu avec: lors de l'initialisation de l'objet de commande, préserver l'ancien état dans elle est l'objet: en faisant passer les données pertinentes dans le constructeur:

public MyCommand(int priority, String state) { 
    previousPriority = priority; 
    previousState = state; 
} 

Ou serait-il préférable de laisser ThreadInfo avoir une liste d'états et de priorités en étant les premiers éléments du courant?

Répondre

4

Maintenez simplement l'ancien état en commande. par exemple

class ChangeFoo { 
    ChangeFoo (Bar bar, foo newFoo){} 
    void execute(){ 
     oldFoo = bar.getFoo(); 
     bar.setFoo(newFoo); 
    } 
    void undo(){ 
     bar.setFoo(oldFoo); 
    } 
} 
+0

Ou détenez une Collection sur une pile. –

+0

@Hovercraft C'était la deuxième approche à laquelle je pensais! –

+0

@platzhirsch: Tout dépend du nombre de niveaux d'annulation que vous désirez. –

2

Je voudrais aller à la première solution: MyCommand constructeur qui enregistre l'état. C'est simple et ça devrait marcher. Pour une approche plus générale annuler/rétablir, jetez un oeil à la memento pattern. Vous pouvez probablement le combiner avec votre approche basée sur les commandes.

0

Java prend déjà en charge les opérations d'annulation/rétablissement. Jetez un oeil à ce tutorial. Vous pouvez étendre la classe AbstractUndoableEdit pour définir la sémantique des opérations annuler/rétablir sur vos objets.

+2

Merci d'avoir souligné cette fonctionnalité Swing, mais il semble que cela se concentre uniquement sur la présentation. Je veux l'annuler/refaire sur mon modèle! –

+1

ok..était juste un petit conseil. – Heisenbug

0

Il est préférable d'avoir une sauvegarde de l'ancien objet dans votre méthode comand. J'ai déjà utilisé ce type d'approche.