Как реализовать шаблон проектирования состояния в модели домена JPA - PullRequest
4 голосов
/ 20 октября 2010

Я хочу реализовать шаблон проектирования состояния в JPA. То, как я сейчас это делаю, описано в этом сообщении в блоге .

Автор использует перечисление, содержащее все доступные реализации состояний, вместо создания абстрактного класса / интерфейса для абстракции состояний и написания реализации для каждого состояния. Я считаю этот подход очень полезным, поскольку перечисления можно легко сериализовать в JPA, и вы можете сохранять текущее состояние вашего объекта без дополнительных усилий. Я также вложил интерфейс состояний и все классы состояний в перечисление, делая их приватными, поскольку они зависят от реализации и не должны быть видны ни одному клиенту. Вот пример кода перечисления:

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);
    }
  }
}

Я хотел бы поделиться этим с вами и поделиться своими мыслями об этом. Считаете ли вы это полезным? Как бы вы внедрили шаблон проектирования состояний в модель домена JPA?

Спасибо, Тео

1 Ответ

0 голосов
/ 11 июля 2016

Ну, это старый вопрос, но ради тех, кто может искать в архивах - я использовал конечный автомат Spring с перечислениями (вместо Strings).

Что касается обработки переходов, существуют аннотации, позволяющие вызывать ваши функции при переходе.

1.1.0.RELEASE предоставляет механизм по умолчанию для сохранения состояния путем постоянства StateMachineContext и альтернативы с использованием persist recipe .

Теперь ссылаясь на JPA - возможно иметь Entity Listener, который будет инициализировать машину состояний при postload (@Postload), я думаю, что это неправильный путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...