2015-12-20 2 views
2

Я создал оболочку (например, командную подсказку). Я беру ввод пользователя и сравниваю строку в том случае, если условие выполнено, когда была введена какая-либо команда. В связи с этим в моем java-коде есть много утверждений if, что не является идеальным. Я ищу лучший способ реализовать эту часть кода. Можно ли сохранить все мои команды, а затем выполнить итерацию по массиву, чтобы увидеть, какие команды необходимо выполнить? Любые хорошие предложения?Дизайн шаблона команды

if (cmd[0].equals("pwd")) {` 
       command = new Pwd(); 
       invoker = new Invoker(command); 
       invoker.action(); 
       } 
else if (cmd[0].equals("ls")) { 
       command = new Ls(); 
       invoker = new Invoker(command); 
       invoker.action(); //this executes the command 
       } 

... так далее

+0

Используйте «Карта», Люк. Или оператор 'switch', но Maps допускают более динамическое поведение, например. возможность расширения списка команд. – Andreas

+0

[Command pattern] (https://en.wikipedia.org/wiki/Command_pattern#Java) –

+0

Спасибо за ссылку. Действительно полезно! –

ответ

1

Вы можете попробовать HashMap<String, Command>().

Map<String, Command> commandMap = new HashMap<String, Command>(); 
commandMap.put("pwd", new Pwd()); 
commandMap.put("ls", new Ls()); 

if(commandMap.containsKey(cmd[0])) { 
    new Invoker(commandMap.get(cmd[0])).action(); 
} 
1

В качестве альтернативы карте вы можете использовать перечисление для фиксированного набора команд. С Java 8 код довольно аккуратный:

class enum Command { 
    PWD("pwd", Context::pwd), 
    LS("ls", Context::ls); 

    private final String command; 
    private final Runnable action; 

    Command(String command, Runnable action) { 
     this.command = command; 
     this.action = action; 
    } 

    public static run(String command) { 
     Arrays.stream(values()) 
      .filter(c -> c.commmand.equals(command)) 
      .findAny().ifPresent(c -> c.action.run()); 
    } 
}