Command模式可以被用来实现Transactional behavior
(和Undo
)。
但我无法通过在google找到这些例子。 我只能发现是灯的一些琐碎的例子switched on
或off
。
我在哪里可以找到一个编码例(最好在Java
这个问题)/这些行为使用实施Command Pattern
?
Answer 1:
在我们的项目之一,我们有以下要求:
- 创建数据库的记录。
- 呼叫服务,以更新相关记录。
- 调用另一个服务登录票。
以事务性方式执行此,每个操作被实现为与撤消操作的命令。 在每一步结束时,该命令被压入堆栈。 如果操作在一些步骤失败,那么我们从栈中弹出的命令,并呼吁每个命令的撤销操作弹出。 在该命令执行被定义每个步骤的撤消操作扭转较早command.execute()。
希望这可以帮助。
Answer 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"));
Answer 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
- 这里还有一个链接,显示了数据库命令模式。 该代码是用C#。 http://www.codeproject.com/Articles/154606/Command-Pattern-at-Work-in-a-Database-Application
Answer 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() ;} ;
}
看看这个撤消,重做为了更好的理解命令的文章。
文章来源: Real world example of application of the command pattern