コマンド パターンTransactional behavior
を使用して(および)を実装できますUndo
。
しかし、グーグルでこれらの例を見つけることができませんでした。switched on
またはであるランプの些細な例しか見つかりませんでしたoff
。を使用して実装されたこの/これらの動作
のコーディング例 (できれば ) はどこにありますか?Java
Command Pattern
4 に答える
私たちのプロジェクトの 1 つでは、次の要件があります。
- DB にレコードを作成します。
- 関連レコードを更新するサービスを呼び出します。
- 別のサービスを呼び出して、チケットをログに記録します。
これをトランザクション方式で実行するために、各操作は元に戻す操作を伴うコマンドとして実装されます。各ステップの最後に、コマンドがスタックにプッシュされます。あるステップで操作が失敗した場合、スタックからコマンドをポップし、ポップアウトされた各コマンドに対して元に戻す操作を呼び出します。各ステップの元に戻す操作は、そのコマンド実装で定義され、以前の command.execute() を元に戻します。
お役に立てれば。
コマンド パターンは多くの場所で使用されます。
- もちろん、どこにでも見られるのは、GUI 実装、スイッチの非常に些細な例です。ゲーム開発にも幅広く使われています。このパターンを使用すると、ユーザーは画面上のボタンも構成できます。
- コマンドを相手に渡す必要がある場合は、ネットワーキングでも使用されます。
- プログラマーがユーザーによって実行されたすべてのコマンドを保存したい場合、たとえば、ゲームでレベル全体を再生できる場合があります。
- コールバックの実装に使用されます。
コールバックに使用するコマンドパターンの例を提供しているサイトです。http://www.javaworld.com/article/2077569/core-java/java-tip-68--learn-how-to-implement-the-command-pattern-in-java.html?page=2
- データベースでのコマンドパターンを示す別のリンクがあります。コードは C# です。http://www.codeproject.com/Articles/154606/Command-Pattern-at-Work-in-a-Database-Application
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"));
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() ;
}
クラスで State を定義します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コマンドの記事をご覧ください。