命令模式可以用来实现Transactional behavior
(和Undo
)。
但是我无法通过谷歌搜索找到这些示例。我只能找到一些微不足道的灯的例子,即switched on
或off
。
我在哪里可以找到Java
使用 ? 实现的这种/这些行为的编码示例(最好在 中)Command Pattern
?
问问题
13715 次
4 回答
24
在我们的一个项目中,我们有以下要求:
- 在数据库中创建记录。
- 调用服务来更新相关记录。
- 调用另一个服务来记录工单。
为了以事务方式执行此操作,每个操作都被实现为具有撤消操作的命令。在每一步结束时,命令被压入堆栈。如果操作在某个步骤失败,则我们从堆栈中弹出命令,并对弹出的每个命令调用撤消操作。每个步骤的撤消操作都在该命令实现中定义,以反转较早的 command.execute()。
希望这可以帮助。
于 2012-08-28T06:25:13.137 回答
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"));
于 2012-08-28T06:23:55.657 回答
2
命令模式用在很多地方。
- 当然,随处可见的是一个非常简单的 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
于 2015-03-24T11:25:51.703 回答
0
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() ;} ;
}
请查看此撤消重做命令文章以更好地理解。
于 2016-02-28T17:28:24.103 回答