Курс Java Multithreading — Лекция: Создание функционала меню для ресторана
— Привет, Амиго!
Сегодня ты начинаешь работу над супер современной и полезной программой! Это – электронное меню. Вот:
— Круто! А для чего это?
— Что-то ты много вопросов задаешь! Вот сделаешь, потом поговорим. Иди к секретному агенту, он даст тебе все необходимые инструкции.
— Товарищ Капитан, я не умею так красиво рисовать!
— Запомни, тебе нужно реализовать необходимую бизнес логику, а картинки будет рисовать дизайнер. Иди к секретному агенту, по ходу дела разберешься.
— Есть разбираться!
undefinedРесторан(1)
Давай напишем программу для автоматизации работы в ресторане. Пусть задание сформулировано так — директор ресторана хочет, чтобы: 1) на каждом столике лежал планшет, через который можно было бы сделать заказ; 2) пока заказ готовится, на планшете показывалась реклама; 3) в конце рабочего дня была во
undefinedРесторан(2)
1.
Мы много работаем с консолью. Пора создать единую точку взаимодействия.
Создай класс ConsoleHelper с единственным BufferedReader, через который будем работать с консолью.
Запомни, этот класс не хранит никаких данных и состояний, поэтому все методы будут статическими.
Создай в нем три метода:
Ресторан(3)
Сейчас мы можем создавать заказы. Давай сделаем так, чтобы они автоматически поступали к повару. Есть много различных способов реализации данной функциональности. Почитай про паттерн Observer — http://en.wikipedia.org/wiki/Observer_pattern Он уже реализован в java, и мы его будем использовать.
undefinedРесторан(4)
Что мы имеем? Повар приготовил блюда, пора их уносить, а официант не знает об этом. Нужно уведомить официанта, что пора забирать заказ с кухни. Ситуация аналогична предыдущему заданию, поэтому снова будем использовать паттерн Observer.
undefinedРесторан(5)
Сейчас повар готовит блюда моментально. На самом деле приготовление занимает какое-то время.
Ресторан(6)
Заказ создается, потом готовится поваром, а после этого относится посетителю. К тому же считается время выполнения заказа. Будем считать, что первая часть задания выполнена. Перейдем ко второй — пока заказ готовится, на планшете должна показываться реклама. Определим, что такое реклама. Реклама — э
undefinedРесторан(7)
При выборе, с какого класса начать, старайся найти тот, который используют другие, и который сам ничего не использует. В нашем случае — это хранилище рекламных роликов (AdvertisementStorage). Мы решили, что оно будет единственным в ресторане и сделали его синглтоном. Опишем его.
undefinedРесторан(8)
Пришло время описать функционал класса AdvertisementManager.
Но для начала нам понадобятся некоторые методы в классе Advertisement.
1. В классе Advertisement создай поле long amountPerOneDisplaying.
Ресторан(9)
Нам понадобится исключение, которое поможет обработать ситуацию, если у нас не будет получаться подобрать рекламные ролики. 1. Создадим unchecked исключение NoVideoAvailableException в пакете ad. 2. Разберем подробно метод void processVideos() в AdvertisementManager.
undefinedРесторан(10)
Рекурсию используют тогда, когда алгоритм решения задачи совпадает с алгоритмом решения подзадачи (части). У нас как раз такой случай. Нам нужно сделать полный перебор всех вариантов и выбрать из них лучший. Напомню, рекурсия пишется по следующему принципу: а) условие выхода/окончания рекурсии б) у
undefinedРесторан(11)
Мы реализовали первые две фичи из трех. Напомню, первой была автоматизация приготовления заказа,
второй — подбор рекламных роликов, а третья — статистика для директора. Собственно, к ней мы и добрались.
Нам нужно будет реализовать следующую функциональность:
1) подсчет статистики
2) отображение ста
Ресторан(12)
У нас выделяются несколько событий: *повар приготовил заказ *выбрали набор видео-роликов для заказа *нет ни одного видео-ролика, который можно показать во время приготовления заказа Это постоянные данные, поэтому для их хранения подходит энам.
undefinedРесторан(13)
Вернемся к методу register в классе StatisticManager. Он должен регистрировать события в хранилище. Создадим хранилище : ) Хранилище связано 1 к 1 с менеджером, т.е. один менеджер и одно хранилище на приложение. К хранилищу может доступиться только StatisticManager. Поэтому… Из вышеперечисленного
Ресторан(14)
1. Внутри StatisticStorage создай метод void put(EventDataRow data).
2. Чтобы методом put(EventDataRow data) добавить объект data в данные карты, нужен тип события — EventType.
Будет правильно, если событие будет хранить в себе свой тип.
Поэтому:
2.1. В интерфейс EventDataRow добавь метод EventType
Ресторан(15)
Давай подумаем что нужно сделать, чтобы директор мог посмотреть: 1) какую сумму заработали на рекламе, сгруппировать по дням; 2) загрузка (рабочее время) повара, сгруппировать по дням; 3) список активных роликов и оставшееся количество показов по каждому; 4) список неактивных роликов (с оставшемся к
undefinedРесторан(16)
Реализуем первый пункт статистики — какую сумму заработали на рекламе, сгруппировать по дням. 1. В классе VideoSelectedEventDataRow создай геттер для поля amount. В классе CookedOrderEventDataRow создай геттер для поля cookName. 2. В StatisticManager создай метод (придумать самостоятельно), которы
undefinedРесторан(17)
Реализуем третий и четвертый пункт статистики — список активных и неактивных роликов. Для этого проще использовать доступ к хранилищу рекламных роликов — класс AdvertisementStorage. 1. В пакете ad создай StatisticAdvertisementManager, который будет предоставлять информацию из AdvertisementStorage в н
undefinedРесторан(18)
Сейчас у нас один планшет и 1 повар.
Давай создадим несколько планшетов, которые будут рандомно генерировать заказы, и сделаем два повара.
1. В классе Restaurant создай ПРИВАТНУЮ статическую константу int ORDER_CREATING_INTERVAL = 100.
2. В отдельном классе создай таск(Runnable) RandomOrderGenerat
Ресторан(19)
Нам осталось доделать метод main. Сперва давай сравним параметры конструктора RandomOrderGeneratorTask. Пожалуйста, сделай сигнатуру такой же, как у меня: public RandomOrderGeneratorTask(List<Tablet> tablets, int interval) В методе main: 1. Удали создание хардкоженного планшета и вызова его метода
undefinedРесторан(20)
Фикс бага — планшет направляет свой заказ всем известным ему поварам. Ожидаемое поведение: планшет направляет свой заказ в очередь, свободный повар берет заказы из очереди. Есть два варианта реализации такого функционала: 1) Каждый планшет хранит ссылку на очередь и толкает в нее новый свой заказ.
undefinedРесторан(21)
Продолжаем фиксить баг.
Ресторан(22)
К сожалению, заказы все еще не готовятся параллельно. Вот как работает наш трэд из предыдущего задания. Он находит повара, потом находит заказ, отдает заказ повару методом startCookingOrder, потом ждет окончания приготовления, и только после этого переходит к следующему заказу. Так происходит потому
undefinedРесторан(23)
Это всё! Красоту можешь наводить самостоятельно.
Как создать меню для приложения. Пошагово
Сегодня мы расскажем: как сделать нижнее меню для приложения.
В этом нам помогут Android Studio и Java.
Приступаем!
У Google для создания меню предусмотрена своя библиотека. Для её добавления в проект достаточно в Gradle приложения, в объект dependencies прописываем две строки:
implementation ‘com.
android.support:appcompat-v7:26.1.0’
implementation ‘com.android.support:design:26.1.0’
После нажимаем Sync Now и ждем несколько секунд.
Теперь мы можем использовать BottomNavigationView (Компонент самого меню)
Далее в папке res создаем папку menu (new->Android Resources Directory), а в строке Directory Name и Resources Type указываем menu. В данной папке мы будем хранить файлы с кнопками, которые будут отображаться в меню.
Создание экземпляра меню
После создания папки menu нам нужно создать сам файл, в котором будут храниться кнопки для меню.
Кликаем ПКМ по папке menu и создаём Menu Resources (new->Menu Resources), даем название файлу.
Открываем этот файл, выбираем режим редактирования Code. Для создания кнопки существует тэг item. В случае, если мы делаем кнопки для меню, то он принимает два обязательных параметра: icon и title.
В параметр icon мы вставляем ссылку на картинку, которую хотим отображать в меню.
В параметр title указываем название, которое будет отображаться под кнопкой.
Также рекомендуем добавить тэг id, чтобы в будущем вы могли отслеживать нажатие кнопок.
Мы создали три кнопки и получился такой код:
<?xml version=»1.0″ encoding=»utf-8″?>
<menu xmlns:android=»http://schemas.android.com/apk/res/android»>
<item
android:id=»@+id/nav_1″
android:icon=»@drawable/ic_android_black_24dp»
android:title=»Вкладка 1″ />
<item
android:id=»@+id/nav_2″
android:icon=»@drawable/ic_android_black_24dp»
android:title=»Вкладка 2″
/>
<item
android:id=»@+id/nav_3″
android:icon=»@drawable/ic_android_black_24dp»
android:title=»Вкладка 3″ />
</menu>
Создание меню
Файл с кнопками готов. Можно приступить к самому главному — созданию меню.
В первую очередь, в активити куда вы хотите вставить меню, нужно изменить ConstraintLayout на RelativeLayout, далее создать тэг BottomNavigationView.
Этот тэг и создаёт меню. Тэг принимает довольно много параметров, поэтому помещаем сюда код и всё комментируем:
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id=»@+id/bottomNavigation» //ID для меню
android:layout_width=»match_parent» //установка ширины
android:layout_height=»wrap_content» //установка высоты
android:layout_alignParentBottom=»true» //прикрепляем меню к низу экрана
android:background=»?android:attr/colorActivatedHighlight» // установка фона
app:menu=»@menu/buttons» //наш файл с кнопками, который мы создавали
/>
Анимации и все остальное подтягиваются автоматически.
Итог
Выполнив всего несколько простых шагов, мы создали такое меню:
Документация JDK 19 — Главная
- Главная
- Ява
- Java SE
- 19
Обзор
- Прочтите меня
- Примечания к выпуску
- Что нового
- Руководство по миграции
- Загрузить JDK
- Руководство по установке
- Формат строки версии
Инструменты
- Технические характеристики инструментов JDK
- Руководство пользователя JShell
- Руководство по JavaDoc
- Руководство пользователя средства упаковки
Язык и библиотеки
- Обновления языка
- Основные библиотеки
- HTTP-клиент JDK
- Учебники по Java
- Модульный JDK
- Руководство программиста API бортового регистратора
- Руководство по интернационализации
Технические характеристики
- Документация API
- Язык и ВМ
- Имена стандартных алгоритмов безопасности Java
- банок
- Собственный интерфейс Java (JNI)
- Инструментальный интерфейс JVM (JVM TI)
- Сериализация
- Проводной протокол отладки Java (JDWP)
- Спецификация комментариев к документации для стандартного доклета
- Прочие характеристики
Безопасность
- Руководство по безопасному кодированию
- Руководство по безопасности
Виртуальная машина HotSpot
- Руководство по виртуальной машине Java
- Настройка сборки мусора
Управление и устранение неполадок
- Руководство по устранению неполадок
- Руководство по мониторингу и управлению
- Руководство по JMX
Client Technologies
- Руководство по специальным возможностям Java