2014-12-27 35 views
1

我目前正在處理中的客戶端類用戶輸入處理用戶輸入,但是我覺得做這個命令對象的執行方法,我會重用可以提高能力作爲一個只需要實例該命令對象使用其功能而不是依賴於來自客戶端的實現。凡在命令模式

其結果是,一個命令對象可以是這樣的:

public class CommandA implements Command { 
    ReceiverA receiverA; 

    public CommandA(RecieverA receiverA) { 
     this.receiverA = receiverA; 
    } 

    @Override 
    public void execute() { 
     Scanner scanner = new Scanner(System.in); 

     String x = scanner.nextLine(); 

     receiverA.methodA(x); 

    } 
} 

我發現缺少的例子,所以我在想,如果這是一個「好」的做法作爲例子我見過一個命令對象只是使用一個接收者的方法。

+1

你需要澄清一下你的問題。在第一段的第二句中似乎缺少了一些單詞,並且在您的示例中您沒有向我們展示「執行」方法。 –

回答

1

希望,用戶輸入直線前進足夠,對於命令行解析,或使用BNF語法將刪除把一堆用戶輸入識別邏輯的客戶機中的簡單生成的解析器的庫。

命令圖案的強度是在允許客戶端延遲命令的執行或一系列的命令,並且在允許客戶機的命令傳遞給它的選擇的一個調用。

花一些系統,其公開了一個CLI,並執行一些數據操作的例子。假設您想對一些用戶操作進行建模:'save-all'和'print-sample'。這些命令中的每一個都可能缺少用戶需要提供的一些必需數據。他們大概也會有其他一些默認選項。你可以使用命令行解析以分離出通過命令行提供的用戶輸入,然後包裹或提取所解析的塊放入SaveAllPrintSample命令實例。膠合邏輯只會使用正確的命令類型。您的代碼將是沿着線:

String[] userInput = ... 
Parsed parsedInput = parser.parse(userInput) 
Command command; 
switch (parsedInput.getCommandName()) { 
    case 'save-all': 
    command = new SaveAll(parsedInput); 
    break; 
    ... 
} 

如果你使用正確的工具,你都不可能放棄甚至這種膠代碼;作爲例子,參見用於Java/Scala的JCommander

你分開裂開用戶輸入的關注後,你的命令類將給予解析輸入,例如:

public class SaveAll implements Command { 
    private String targetName; 
    private char separator = ',' 

    private DataSet dataset; 
    private Filesystem filesystem; 

    public SaveAll(Parsed input) { 
    targetName = input.getTargetName(); 
    if (input.getSeparator() != null) { 
     separator = input.getSeparator(); 
    } 
    } 

    @Injected 
    public void setDataSet(...) { ... } 

    @Injected 
    public void setFilesystem(...) { ... } 

    public void execute() { 
    try (Datafile file = filesystem.openForWrite(targetName)) { 
     for (Row row : dataset.rows()) { 
     file.writeRow(row, separator); 
     } // rows loop 
    } // auto-resource 
    } // end execute() 
} 

最後,在這個例子中,客戶端(工具將CLI暴露給用戶)可以允許用戶連接到各種系統。在下面,它會爲每個系統調用一個調用者。因此該命令將被移交給適當的調用者。 (這調用可能序列化或排隊命令。)

+0

這很好,你在你的例子中使用了一個具體的命令。但是,如果輸入包含錯誤,例如targetName是一個無效文件並在執行中導致異常,會發生什麼情況?在調用execute之前,更強大的設計不會檢查有效的數據嗎? – Fuhrmanator

0

在GoF的使用初始模式的定義的UML:

UML diagram of the Command pattern

我認爲答案誰處理輸入?Invoker類(或稱爲它的類)等效。

這絕對不是ConcreteCommands,因爲它的目的是最終能夠撤消或重做命令。如果它依賴​​方法中的解析輸入,則重新執行(連續調用​​)將不起作用。

命令對象需要最少量的信息才能完成工作。這意味着它必須知道Receiver對象(對於每個命令可能不同),並且可能還有一些參數用於命令。我不會在ConcreteCommand的內部處理任何輸入(即使它被解析了)。