Мой подход в этом случае - написать шаблон Factory вместе с шаблоном Command.
Каждый «сегмент» выполняемой работы может быть помещен в класс, который реализует интерфейс с одним важным методом: execute ().
Следующее:
Интерфейс:
public interface Command {
void execute();
}
Все команды будут реализовывать это:
public class SayWelcomeCommand implements Command {
@Override
public void execute() {
System.out.println("Welcome");
}
}
И еще одна команда для работы «Трейдера»:
public class TraderCommand implements Command {
@Override
public void execute() {
// doing some work...
inv.add("Health Potion");
inv.remove("Water Bottle");
// more work...
}
}
Вы создаете команды в соответствии с известным строковым ключом:
public class CommandsFactory {
public static Command createCommand(String commandKey) {
switch (commandKey) {
case 'welcome': return new SayWelcomeCommand(); break;
case 'trader': return new TraderCommand(); break;
case 'exit': return new ExitCommand(); break; // todo: create that cmd..
}
}
}
Теперь в вашей MAIN-программе вы просто вызываете фабрику и выполняете!
while (true) {
String commandKey = System.in.readLine... // get from the user a command.
Command command = CommandFactory.createCommand(commandKey);
command.execute();
}
Таким образом, вы продолжаете бесконечно создавать различные команды, пока команда «выход» не просто выключит игру ... с сообщением, например.
Переключатель просто переместился на Фабрику, но даже там вы можете улучшить фабрику, чтобы прочитать путем отражения имен классов из конфигурационного файла и поместить их в карту объектов String to Command (ключ Map будет строкой, команда и значение Map будет объектом Command). так что вы полностью удалите использование switch из вашей программы.