Шаблон команды можно использовать для реализации Transactional behavior
(и Undo
).
Но я не мог найти их пример по поиску. Я мог найти только некоторые тривиальные примеры лампы switched on
или off
.
Где я могу найти пример кодирования (предпочтительно в Java
) этого/такого поведения, реализованного с помощью Command Pattern
?
Реальный пример применения шаблона команды
Ответ 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
- Здесь другая ссылка, которая показывает шаблон команды с базой данных. Код находится в С#. 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 для лучшего понимания.