摘要:目錄命令模式為什么使用命令模式命令模式應用實例命令模式命令模式在軟件系統中,行為請求者與行為實現者通常呈現一種緊耦合。下篇更代理模式,側重下其和委托形式的區別和實際應用。
目錄
命令模式
為什么使用命令模式
命令模式應用實例
命令模式命令模式:在軟件系統中,“行為請求者”與“行為實現者”通常呈現一種“緊耦合”。但在某些場合,比如要對行為進行“記錄、撤銷/重做、事務”等處理,這種無法抵御變化的緊耦合是不合適的。在這種情況下,如何將“行為請求者”與“行為實現者”解耦?將一組行為抽象為對象,實現二者之間的松耦合。這就是命令模式(Command Pattern)
從上面對于命令模式的定義也反映出了為什么要使用命令模式,通過將一系列的操作封裝成一個命令對象,方便執行,同時也能夠很好的讓我們進行一些操作回滾,用來記錄是否執行過該操作等問題。
為什么使用命令模式當我們有一系列任務要進行處理,也就是很多方法,而且這些任務之間沒有明顯的先后順序,而我們只有一個線程用來執行任務,比如某個物品的裝配任務,不同的人采用了不同的裝配順序,假設不同裝配順序都可產生該產品,但是只有一個裝配機器進行裝配任務,因此我們不可能將每個裝配步驟寫在裝配機器程序中,因為每個人的裝配步驟是不同的,所以每個用來執行裝配任務的機器必須能夠進行動態的調整,所以這個時候命令模式的作用發揮出來了,我們可以這樣架構該系統。代碼如下:
/定義一個命令接口 public interface Command{ public void execute(); public void undo(); } //其中的一個命令繼承自這個接口 public class addPatCommand implements Command{ public void execute(){ doSomething... } public void undo(){ undo... } } //執行者,用來執行命令 public class Executer{ //命令隊列 ArrayListcommandList = new ArrayList (); //記錄當前已經執行的命令 int executed = 0; //執行命令 public void execute(){ if(commandList.size()==0) System.out.println("Please add a command"); else{ for(int i=executed; i =0; i--){ commandList.get(i).undo(); } } } }
通過上面的代碼,我們可能發現這有些像是之前的策略模式,對不同的行為多帶帶進行封裝,然后通過add方法將依賴實例注入,然后通過一個list持有依賴集群,然后再通過對依賴隊列的遍歷來執行方法,策略模式可能唯一不同的是在在內部通過委托的方式來執行方法,再就是策略模式中每個委托對象所要被調用的方法不同,而且每個注入的實例也將會被用到不同的方法之中,而命令模式則是將其置于一個方法之中。
命令模式應用實例數據庫中的事務,可以通過這種方式來實現回滾,日常安排,線程池,工作隊列等,通過著我們可以很好的實現被操作對象和操作者之間的解耦,同時還可以實現撤銷操作。
Android中的Thread通過構造函數接納實現了Runnable接口的類,這個運用的就是命令模式,當然我們平常更多會是通過匿名內部類的形式來將依賴實例注入。
下篇更代理模式,側重下其和委托形式的區別和實際應用。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64598.html
摘要:我們今天也來做一個萬能遙控器設計模式適配器模式將一個類的接口轉換成客戶希望的另外一個接口。今天要介紹的仍然是創建型設計模式的一種建造者模式。設計模式的理論知識固然重要,但 計算機程序的思維邏輯 (54) - 剖析 Collections - 設計模式 上節我們提到,類 Collections 中大概有兩類功能,第一類是對容器接口對象進行操作,第二類是返回一個容器接口對象,上節我們介紹了...
閱讀 1002·2023-04-25 19:35
閱讀 2660·2021-11-22 09:34
閱讀 3690·2021-10-09 09:44
閱讀 1724·2021-09-22 15:25
閱讀 2940·2019-08-29 14:00
閱讀 3374·2019-08-29 11:01
閱讀 2600·2019-08-26 13:26
閱讀 1740·2019-08-23 18:08