希望,用戶輸入直線前進足夠,對於命令行解析,或使用BNF語法將刪除把一堆用戶輸入識別邏輯的客戶機中的簡單生成的解析器的庫。
命令圖案的強度是在允許客戶端延遲命令的執行或一系列的命令,並且在允許客戶機的命令傳遞給它的選擇的一個調用。
花一些系統,其公開了一個CLI,並執行一些數據操作的例子。假設您想對一些用戶操作進行建模:'save-all'和'print-sample'。這些命令中的每一個都可能缺少用戶需要提供的一些必需數據。他們大概也會有其他一些默認選項。你可以使用命令行解析以分離出通過命令行提供的用戶輸入,然後包裹或提取所解析的塊放入SaveAll
或PrintSample
命令實例。膠合邏輯只會使用正確的命令類型。您的代碼將是沿着線:
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暴露給用戶)可以允許用戶連接到各種系統。在下面,它會爲每個系統調用一個調用者。因此該命令將被移交給適當的調用者。 (這調用可能序列化或排隊命令。)
你需要澄清一下你的問題。在第一段的第二句中似乎缺少了一些單詞,並且在您的示例中您沒有向我們展示「執行」方法。 –