应用命令模式的真实世界示例
命令模式可用于实现Transactional behavior
(和Undo
)。
但是我用谷歌搜索找不到这些例子。 我只能找到switched on
或off
灯泡的一些简单例子。
在哪里可以找到使用Command Pattern
实现的/这些行为的编码示例(最好是Java
)?
在我们的一个项目中,我们有以下要求:
- 在DB中创建记录。
- 调用服务以更新相关记录。
- 调用另一个服务来记录故障单。
为了以事务方式执行此操作,每个操作都实现为具有撤消操作的命令。 在每个步骤结束时,命令被压入堆栈。 如果操作在某个步骤失败,那么我们从堆栈中弹出命令并在弹出的每个命令上调用undo操作。 每个步骤的撤消操作都在该命令实现中定义,以反转先前的command.execute()。
希望这可以帮助。
public final class Ping implements Callable { private final InetAddress peer; public Ping(final InetAddress peer) { this.peer = peer; } public Boolean call() { /* do the ping */ ... } } ... final Future result = executorService.submit(new Ping(InetAddress.getByName("google.com"))); System.out.println("google.com is " + (result.get() ? "UP" : "DOWN"));
命令模式在很多地方使用。
- 当然,你到处看到的是一个非常简单的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
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
类中定义一个State。 根据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命令文章,以便更好地理解。