2012-03-12 64 views
0

每個GoF設計模式(wikipedia),ConcreteCommand實例應該(必須)具有到Receiver實例的鏈接(參考)。我執行以下命令:正確的命令設計模式實現需要鏈接到接收器嗎?

internal class PutBlockOntoBlockCommand : ICommand { 
    private readonly int _srcTower; 
    private readonly int _dstTower; 

    public PutBlockOntoBlockCommand(int srcTower, int dstTower) { 
     _srcTower = srcTower; 
     _dstTower = dstTower; 
    } 

    public void Execute(Robot robot, Construction construction) { 
     robot.MoveBlocks(_srcTower, _dstTower, construction); 
    } 
} 

該命令指示機器人在建築工地上移動塊。注意命令的實例沒有提及接收器(機器人)的實例;相反,命令依賴於Invoker(在我的情況下爲RobotCommandCenter)來提供Robot的實例來執行該命令。

我深信,一個命令是一個命令,它應當封裝的意圖,應該負責指定命令的目標。就我而言,作爲一個用戶,我並不在乎使用哪個機器人來執行作業。

所以我的問題是:它是否在技術上有效提及作爲「命令設計模式」提出的實現?

回答

1

首先,沒有設計模式警察。它總是開放的解釋和灰色的色調。

其次,維基百科是不是原始卷好,使這本書:)

GoF的列表中的Command模式爲目的的投資:

封裝的請求作爲對象,從而允許您將具有不同請求,隊列或日誌請求的客戶端參數化爲 ,並支持可撤消操作。

如果你遇到這些意圖中的任何一個,我會說你可以稱之爲命令的衍生物。

如果一個命令持有執行或調用所需效果的邏輯,則可以通用地告訴某個命令,從而釋放命令引用的持有者處理這些細節。通常這樣封裝,你可以做一些很酷的事情,比如把它們放在一個列表中,並使用基本中定義的通用Execute方法來非常乾淨地執行Redo和Undo。

如果您的基類定義了Execute,並且您的調用代碼將所有命令傳遞給機器人引用,那麼您將擁有一個Command,但其中一個具有策略或輕量級方面,允許您更改命令的目標。我可以看到這方面的用途,儘管以undo/redo爲代價。

+0

我有書,無法鏈接,所以我指的是來源。沒有「英國警察」這樣的東西,並不意味着「我很好」是正確的。請注意,我問我的實現是否是「技術上」的命令設計模式。 – 2012-03-12 21:18:06

+0

@ THX-1138這就是我的意思,但我不知道Command模式有一個「技術定義」。我想用我的「設計模式警察」的幽默聲明來說,這是主觀的。我的意見如我上面所述。 – tcarvin 2012-03-13 11:58:26