Найти в Дзене
Записки о Java

Реализация системы талонов в банке: очередь по категориям на Java

Задача: смоделировать систему выдачи талонов в банке, где клиенты получают талоны четырёх типов:Вклады
Кредитные карты / Продукты
Кредиты
Другие вопросы
Каждый тип талона направляется в соответствующее «окошко» (обработчик). Нужно реализовать гибкую, расширяемую систему без жёсткой привязки к конкретным классам. Разберём решение шаг за шагом — от модели до логики обработки. Создадим базовый класс Ticket, который будет содержать: 💡 Мы используем AtomicLong для потокобезопасной генерации ID — важно, если система будет многопользовательской. Вместо простого enum добавим описание и связь с обработчиком: ✅ Преимущество: легко добавить новую категорию — просто новый элемент enum. Каждое «окошко» — это стратегия обработки. Создадим интерфейс: А теперь — конкретные реализации: Каждый обработчик знает только свой тип — это принцип единой ответственности (SRP). Чтобы не создавать обработчики вручную, используем Factory: Теперь соберём всё в рабочую систему: Пример, рассмотренный в статье, мож
Оглавление
Рисунок: электронная очередь
Рисунок: электронная очередь

Задача: смоделировать систему выдачи талонов в банке, где клиенты получают талоны четырёх типов:Вклады
Кредитные карты / Продукты
Кредиты
Другие вопросы
Каждый тип талона направляется в соответствующее «окошко» (обработчик). Нужно реализовать гибкую, расширяемую систему без жёсткой привязки к конкретным классам.

Разберём решение шаг за шагом — от модели до логики обработки.

Шаг 1. Модель талона

Создадим базовый класс Ticket, который будет содержать:

  • уникальный ID,
  • тип обращения,
  • время выдачи.
Рисунок: класс Ticket
Рисунок: класс Ticket

💡 Мы используем AtomicLong для потокобезопасной генерации ID — важно, если система будет многопользовательской.

Шаг 2. Типы талонов — enum с поведением

Вместо простого enum добавим описание и связь с обработчиком:

Рисунок: enum TicketType
Рисунок: enum TicketType

✅ Преимущество: легко добавить новую категорию — просто новый элемент enum.

Шаг 3. Обработчики — паттерн Strategy

Каждое «окошко» — это стратегия обработки. Создадим интерфейс:

Рисунок: интерфейс TicketHandler
Рисунок: интерфейс TicketHandler

А теперь — конкретные реализации:

Рисунок: класс DepositsHandler
Рисунок: класс DepositsHandler
Рисунок: класс CreditCardsHandler
Рисунок: класс CreditCardsHandler
Рисунок: класс LoansHandler
Рисунок: класс LoansHandler
Рисунок: класс OtherIssuesHandler
Рисунок: класс OtherIssuesHandler

Каждый обработчик знает только свой тип — это принцип единой ответственности (SRP).

Шаг 4. Фабрика обработчиков

Чтобы не создавать обработчики вручную, используем Factory:

Рисунок: класс TicketHandlerFactory
Рисунок: класс TicketHandlerFactory

Шаг 5. Очередь и диспетчеризация

Теперь соберём всё в рабочую систему:

Рисунок: класс BankQueueSystem, часть 1
Рисунок: класс BankQueueSystem, часть 1
Рисунок: класс BankQueueSystem, часть 2
Рисунок: класс BankQueueSystem, часть 2

Шаг 6. Демонстрация работы

Рисунок: класс Main, демонстрация работы
Рисунок: класс Main, демонстрация работы

Возможные улучшения

  • Заменить ArrayList на ConcurrentLinkedQueue для многопоточной среды.
  • Добавить приоритеты (VIP-клиенты).
  • Сохранять очередь в файл или БД.
  • Ввести ограничение на количество талонов в категории.

Заключение

Пример, рассмотренный в статье, можно найти по адресу:
https://github.com/ShkrylAndrei/blog_yandex/tree/main/src/main/java/info/examples/electronic_queue