Предисловие
Часто во время разработки нужно сделать консольное меню. Это может быть утилита для пользы проекта, проверка какого-нибудь концепта или свой небольшой проект по ознакомлению с новой технологией. И вот когда я в 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