2010-12-02 43 views

回答

6

命令模式將知道如何從知道何時需要完成的代碼和使用什麼參數的代碼中分離出代碼。

最明顯的例子是一個按鈕,它知道你什麼時候點擊它,但不知道當時要做什麼。命令模式可以讓你將一個do-some-work對象傳遞給按鈕,當點擊它時調用該對象。

0

它描述了一個問題的解決方案。主要是,我們想發佈命令,不想定義超過8個類的30個方法來實現這一點。通過使用模式提及,我們發出一個Command對象,並且該對象可以自由地忽略它,或者在某些方面對其執行操作。 Command對象的複雜性是由實現定義的,但這是告訴對象「嘿,這樣做」的好方法。因爲我們已經將它封裝在一個對象中,所以我們可以進一步排隊命令,按照我們希望的時間間隔調度它們,並且還原它們(當然提供的是,您發送命令的對象可以「撤消」命令以及'做它')。

因此,設想一個繪圖包,允許您將圖形添加到畫布。每次用戶這樣做,都可以發出命令:

m_Canvas.push_back(new Line(1.0f, 2.0f)); 
m_Canvas.push_back(new Line(3.5f, 3.1f)); 
m_Canvas.push_back(new Circle(2.0f, 3.0f, 1.5f)); 

等等。假定LineCircle是從一個普通的Command基類派生的。

我們的渲染器可以使用這個canvas集合作爲渲染的一種方式,而un-doing只是刪除最後執行的命令的一種情況。通過跟蹤用戶在一個單獨的集合中沒有做的事情,我們也可以重做。

14

的想法是,如果命令被封裝爲對象然後這些命令可被捕獲,存儲,排隊,重放等

這也使得更容易爲命令知道如何撤消本身(即執行反向操作),這樣如果一個命令被處理了,它可以被存儲在一個列表中,然後以相反的順序'撤消'以在命令完成之前恢復狀態。

此外,它從接收器中分離命令的發送者。這可以允許多個事物生成相同的命令(例如菜單項和按鈕),並且它們將以相同的方式處理。

1

基本上,Command模式是一種在Java(或C#)中部分實現「Function as object」的方法。

既然你不能只是創建一個函數(或方法),並做任何你想要的東西,比如將它作爲參數傳遞給其他某個函數,或者將其保存在一個變量中供以後執行,這是要做的解決方法即:

  1. 您將一些代碼包裝在一個類中(這是您的execute方法)。
  2. 實例化該類。現在,您擁有的這個對象是「作爲對象的函數」。
  3. 您可以將對象作爲參數傳遞,保留它或任何東西。
  4. 最終,您需要撥打execute方法。
7

這是封裝異步操作並將其參數和上下文保存在一個位置的好方法。

E.g.一個HTTP請求:您通過套接字發送請求,並等待響應到達。如果您的申請是例如一個網絡瀏覽器,你不想阻塞,直到請求完成,但繼續前進。如果響應到達,則必須在上下文中繼續,例如,讀取數據並將其放到正確的位置(例如,將下載的圖像數據放在某處以備後續渲染)。如果您有一個大型客戶端類引發多個異步操作,那麼要將響應匹配到它所屬的上下文可能會變得棘手。迴應可能以任意順序到達。哪個響應屬於哪個?應對措施又應該做什麼?如何處理可能的錯誤?如果你將這些請求封裝在命令中並讓這些命令只接收到他們自己的響應,他們會更好地知道如何從那裏繼續並處理響應。如果你有一系列的請求/響應,跟蹤序列的狀態也更容易。可以將命令分組爲組合命令(複合模式)。 客戶端將所需的所有內容都傳遞給該命令,並等待命令完成,並報告成功或錯誤。當使用

另一大優勢是多線程:如果運行需要的所有數據被封裝在命令對象,可以很容易地命令移動到另一個線程,有它在那裏執行,沒有通常的鎖定頭痛您可以在線程之間共享對象。創建命令,將所需的所有內容傳遞給它(複製,而不是引用),傳遞給其他線程,僅在接收結果時進行同步,完成。