Подтвердить что ты не робот

Реальный пример применения шаблона команды

Шаблон команды можно использовать для реализации Transactional behaviorUndo).
Но я не мог найти их пример по поиску. Я мог найти только некоторые тривиальные примеры лампы switched on или off.
Где я могу найти пример кодирования (предпочтительно в Java) этого/такого поведения, реализованного с помощью Command Pattern?

4b9b3361

Ответ 1

В одном из наших проектов мы выполняем следующее требование:

  • Создайте запись в БД.
  • Вызов службы для обновления связанной записи.
  • Вызовите другую услугу, чтобы зарегистрировать билет.

Чтобы выполнить это транзакционным образом, каждая операция выполняется как команда с отменой операции. В конце каждого шага команда помещается в стек. Если операция не выполняется на каком-то этапе, мы вытаскиваем команды из стека и вызываем отмену операции по каждой из выведенных команд. Операция отмены каждого шага определяется в этой реализации команды, чтобы отменить предыдущую команду .execute().

Надеюсь, что это поможет.

Ответ 2

public final class Ping implements Callable<Boolean> {

  private final InetAddress peer;

  public Ping(final InetAddress peer) {
    this.peer = peer;
  }

  public Boolean call() {
    /* do the ping */
    ...
  }
}
...
final Future<Boolean> result
    = executorService.submit(new Ping(InetAddress.getByName("google.com")));
System.out.println("google.com is " + (result.get() ? "UP" : "DOWN"));

Ответ 3

Шаблоны команд используются во многих местах.

  • Конечно, то, что вы видите повсюду, является очень тривиальным примером реализации GUI, коммутаторов. Он также широко используется в разработке игр. С помощью этого шаблона пользователь может также настроить свои кнопки на экране.
  • Он также используется в сети, если команда должна быть передана на другой конец.
  • Когда программисты хотят сохранить все команды, выполненные пользователем, например. иногда игра позволяет воспроизводить весь уровень.
  • Он используется для реализации обратных вызовов.

Вот сайт, который представляет собой пример шаблона команды, используемого для обратного вызова. http://www.javaworld.com/article/2077569/core-java/java-tip-68--learn-how-to-implement-the-command-pattern-in-java.html?page=2

  1. Здесь другая ссылка, которая показывает шаблон команды с базой данных. Код находится в С#. http://www.codeproject.com/Articles/154606/Command-Pattern-at-Work-in-a-Database-Application

Ответ 4

You have to define undo(), redo() operations along with execute() in Command interface itself.

Пример:

interface ChangeI {
    enum State{ READY, DONE, UNDONE, STUCK } ;
    State getState() ;

    void execute() ;    
    void undo() ;    
    void redo() ;
}

Определите состояние в классе ConcreteCommand. В зависимости от текущего состояния после метода execute() вы должны решить, следует ли добавить команду в Undo Stack или Redo Stack и принять соответствующее решение.

abstract class AbstractChange implements ChangeI {
    State state = State.READY ;

    public State getState() { return state ; }

    public void execute() {
        assert state == State.READY ;
        try { doHook() ; state = State.DONE ; }
        catch( Failure e ) { state = State.STUCK ; }
        catch( Throwable e ) { assert false ; }
    }

    public void undo() { 
        assert state == State.DONE ; }
        try { undoHook() ; state = State.UNDONE ; }
        catch( Failure e ) { state = State.STUCK ; }
        catch( Throwable e ) { assert false ; }
    }

    public void redo() {
        assert state == State.UNDONE ;
        try { redoHook() ; state = State.DONE ; }
        catch( Failure e ) { state = State.STUCK ; }
        catch( Throwable e ) { assert false ; }
    }

    protected abstract void doHook() throws Failure ; 

    protected abstract void undoHook() throws Failure ; 

    protected void redoHook() throws Failure { doHook() ;} ; 
}

Посмотрите на эту статью undo-redo для лучшего понимания.