Command pattern可以用來實現Transactional behavior
(和Undo
)。
但我找不到這樣的一個例子,用谷歌搜索。我只能找到switched on
或off
燈的一些微不足道的例子。
我在哪裏可以找到使用Command Pattern
實現的這些/這些行爲的編碼示例(最好在Java
)?現實世界中應用命令模式的例子
回答
在我們的項目之一,我們有以下要求:
- 創建數據庫的記錄。
- 調用服務更新相關記錄。
- 調用另一項服務來記錄票證。
要以事務處理方式執行此操作,每個操作都將作爲具有撤消操作的命令來實現。在每個步驟結束時,命令被壓入堆棧。如果操作在某個步驟中失敗,那麼我們彈出堆棧中的命令,並在彈出的每個命令上調用undo操作。每個步驟的撤消操作都是在該命令實現中定義的,以反轉早期的command.execute()。
希望這會有所幫助。
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"));
這個例子是什麼? – Jim
@Jim關於模式的維基百科文章明確指出以下內容......「*一個典型的通用線程池類可能有一個公共的'addTask'方法,它將工作項添加到等待完成的任務的內部隊列中。...隊列中的項目是命令對象,通常這些對象實現一個通用接口,例如'java.lang.Runnable',它允許線程池執行命令,即使線程池類本身沒有任何知識*「 – oldrinb
@Jim這是Java中的一個例子,除了使用'Callable'而不是'Runnable'和['ExecutorService'](http:// docs。 oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html)。在關於維基百科文章本身的討論中可以看到類似的例子(這裏是http://en.wikipedia.org/wiki/Talk%3ACommand_pattern#Python_examples)。 – oldrinb
命令模式被用在很多地方。
- 當然你到處看到的是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
類中定義的國家。取決於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命令文章,以便更好地理解。
- 1. Exec的現實世界的例子
- 2. Builder模式的真實世界示例
- 3. 尋找真實世界的Gradle例子
- 4. Multiton - 真實世界的例子?
- 5. 你好世界虛擬現實應用
- 6. 上的幾乎現實世界的應用軌道例子大紅寶石
- 7. 什麼是C++多繼承的現實世界的例子?
- 8. 實現命令模式
- 9. hello世界ehcache的例子?
- 10. 現實世界前/後階遍歷樹遍歷的例子
- 11. 尋找現實世界的例子爲ServiceStack
- 12. 協變和逆變現實世界的例子
- 13. 在現實世界中的設計模式
- 14. 接口的使用,實際的和真實世界的例子
- 15. OOP真實世界示例
- 16. 你有一個現實世界中的AttachedPropertyBrowsableWhenAttributePresentAttribute用法的例子嗎?
- 17. 使用resque實現命令模式
- 18. Mesos真實世界的用例
- 19. RxJava的真實世界用例對象
- 20. 單位對現實世界
- 21. php中的特質 - 任何真實世界中的例子
- 22. 爲什麼在Java代碼中實現單例模式(有時)被認爲是Java世界中的反模式?
- 23. 「現實世界」中的功能技巧
- 24. 如何獲取實例變量在世界模塊中可用?
- 25. 使用os.plock的真實世界的例子?
- 26. 在javascript中記憶的真實世界的例子?
- 27. 真實世界的接口實現
- 28. 在現實世界中理解monad的應用
- 29. ASP.NET MVC在現實世界中的應用
- 30. 在Python中重載__new__方法的現實世界示例
不知道我關注。一個事務被rollbacked.Is不是由撤消操作組成的。你是如何用命令模式實現原子部分的? – Jim
在數據庫級事務中,每個操作都是具有撤消和重做操作的命令。在回滾時,DBMS將調用撤銷操作來恢復對其所保存的數據庫副本所做的更改。我們在跨系統的分佈式事務中模擬同樣的事情。這現在有道理嗎? – Vikdor
'恢復對其保存的數據庫副本所做的更改'。因此該命令首先應用於數據副本而不是實際數據?我認爲它直接應用於數據,這就是爲什麼您需要'撤銷'。你的描述有點清晰,但我需要更多的底層細節,如果可能的話可以看到大圖 – Jim