2010-10-20 9 views
4

Je souhaite implémenter le modèle de conception d'état dans JPA. La façon dont je fais actuellement ceci est décrite dans ce blog post.Comment implémenter le modèle de conception d'état dans un modèle de domaine JPA

L'auteur utilise une énumération contenant toutes les implémentations d'état disponibles au lieu de créer une classe/interface abstraite pour l'abstraction d'état et l'implémentation de l'écriture pour chaque état. Je trouve cette approche très utile, car les enums peuvent être facilement sérialisés en JPA et vous pouvez stocker l'état actuel de votre objet sans effort supplémentaire. J'ai également imbriqué l'interface d'état et toutes les classes d'état dans l'énumération, ce qui les rend privées, car elles sont spécifiques à l'implémentation et ne devraient être visibles par aucun client. Voici un exemple de code de l'ENUM:

public enum State { 

    STATE_A(new StateA()), 
    STATE_B(new StateB()); 

    private final StateTransition state; 

    private State(StateTransition state) { 
    this.state = state; 
    } 

    void transitionA(Context ctx) { 
    state.transitionA(ctx); 
    } 

    void transitionB(Context ctx) { 
    state.transitionB(ctx); 
    } 

    private interface StateTransition { 

    void transitionA(Context ctx); 

    void transitionB(Context ctx); 
    } 

    private static class StateA implements StateTransition { 

    @Override 
    public void transitionA(Context ctx) { 
     // do something 
    ctx.setState(STATE_B); 
    } 

    @Override 
    public void transitionB(Context ctx) { 
     // do something 
    ctx.setState(STATE_A); 
    } 
    } 

    private static class StateB implements StateTransition { 

    @Override 
    public void transitionA(Context ctx) { 
    throw new IllegalStateException("transition not allowed"); 
    } 

    @Override 
    public void transitionB(Context ctx) { 
     // do something 
    ctx.setState(STATE_A); 
    } 
    } 
} 

Je voudrais partager avec vous et obtenir vos pensées sur elle. Trouvez-vous cela utile? Comment implémenteriez-vous le modèle de conception d'état dans un modèle de domaine JPA?

Remerciez, Theo

Répondre

0

Eh bien, il est une question ancienne, mais pour le bien de ceux qui pourraient rechercher des archives - J'ai utilisé la machine d'état de printemps avec énumérations (au lieu Cordes). En ce qui concerne la gestion des transitions, des annotations permettent d'appeler vos fonctions lors de la transition. 1.1.0.RELEASE donne un mécanisme par défaut pour conserver un état par persisting StateMachineContext, et une alternative en utilisant persist recipe.

Maintenant, se référant à JPA - il est possible d'avoir Entity Listener qui va initialiser statemachine sur postload (@Postload), je pense que ce n'est pas bon chemin à parcourir.

Questions connexes