В зависимости от того, как будут выглядеть ваши команды, вы можете использовать Map<String, Command>
, который затем будете использовать следующим образом:
Map<String, Command> PROTOCOL = ... //you build that map somehow
Command c = PROTOCOL.get(handle);
if( c != null ) {
System.out.println("good");
c.execute();
} else {
throw new Exception("Don't understand <" + handle + ">");
}
Command
может быть интерфейсом класса или функции:
interface Command {
void execute();
}
Используется как интерфейс класса
class MyCommand implements Command {
//this can have private data
void execute() {
//do whatever is needed
}
}
PROTOCOL.put("mycommand", new MyCommand(/*you could pass parameters here*/));
Преимущества:
- Интерфейс может иметь более 1 метода, например он также может иметь
String getName()
.
- Команды могут иметь параметры, например, Вы можете предоставить одну реализацию и использовать разные имена, которые связаны с одной и той же командой с разными параметрами (например, «приращение» и «уменьшение» могут быть привязаны к
AddCommand(1)
и AddCommand(-1)
).
- Вы можете использовать некоторый механизм инверсии зависимостей (например, через CDI), чтобы команды регистрировались в
PROTOCOL
. Таким образом, вы даже можете добавлять команды через какой-то механизм плагинов.
- Использование интерфейсов для классов может быть проще для понимания другими.
- Легче структурировать для больших команд, так как вы можете легко извлечь классы в отдельные файлы.
Используется как интерфейс функции (например, через лямбды)
PROTOCOL.put("mycommand", () -> {
//do whatever is needed
});
Преимущества:
- Не нужны классы, которые могут быть более краткими для коротких команд.