Предисловие
Часто во время разработки нужно сделать консольное меню. Это может быть утилита для пользы проекта, проверка какого-нибудь концепта или свой небольшой проект по ознакомлению с новой технологией. И вот когда я в 10-ый раз начал писать меню, я остановился и задумался: а может просто вынести это всё в библиотеку, да и пусть валяется в локальном репозитории maven'а? Сказано - сделано.Реализация
Основа меню - это абстрактный класс MenuEntry. У него есть единственное поле title, а также абстрактный метод run.
public abstract class MenuEntry {
private String title;
public MenuEntry(String title) {
this.title = title;
}
public abstract void run();
}
Это позволит нам описать, что должно произойти при выборе этого пункта меню, не заморачиваясь на создании новых классов, как это происходит при разработке с паттерном Команда (Command). Например, вот так:new MenuEntry("Entry Name") {
@Override
public void run() {
someStuff();
}
}
Теперь нужен только какой-нибудь контейнер, который будет в хранить все пункты меню и выводить их в бесконечном цикле. Этим будет заниматься класс Menu. В качестве дополнения, он будет автоматически создавать пункт меню Exit и добавлять его в конец списка.public class Menu {
private List entries = new ArrayList();
private boolean isExit = false;
public Menu() {
// Добавляем пункт меню Exit
entries.add(new MenuEntry("Exit") {
@Override
public void run() {
isExit = true;
}
});
}
public void run() {
// Бесконечный цикл, пока не нажали кнопку выход
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
while (!isExit) {
printMenu();
try {
String line = reader.readLine();
int choice = Integer.parseInt(line);
// Выбираем нажатый пункт меню и выполняем его код
MenuEntry entry = entries.get(choice - 1);
entry.run();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Ну а вот пример того, как это всё добро можно использовать:Menu menu = new Menu();
menu.addEntry(new MenuEntry("test1") {
@Override
public void run() {
System.out.println("test1 run");
}
});
menu.addEntry(new MenuEntry("test2") {
@Override
public void run() {
System.out.println("test2 run");
}
});
menu.run();
Ссылки
Исходники можно посмотреть на github
Удачного кодинга!
This comment has been removed by the author.
ReplyDelete