Настройка нескольких декораторов с пико-контейнером

Я использовал пико-контейнер в Java, чтобы сделать DI для фреймворка Minecraft, который я разработал.

Плагины имеют методы прослушивания событий, которые определены в интерфейсах, по одному методу на интерфейс.

Если определенный класс хочет события, когда игроки присоединяются и покидают сервер, он реализует два конкретных интерфейса; в этом случае IPlayerLoginEvent и IPlayerQuitEvent.

Затем у меня есть класс в рамках, который принимает каждый тип интерфейса события в качестве аргумента, введенного конструктором.

Этот контейнерный класс помечен @Listener для серверного программного обеспечения craftbukkit, чтобы вызвать его.

Класс-оболочка оборачивает данные, отправляемые craftbukkit, классом, специфичным для фреймворка, что позволяет, по крайней мере теоретически, писать независимые от сервера плагины.

Небольшой пример:

Плагин AwesomePlugin имеет класс PlayerHandler, который реализует IPlayerLoginEvent и IPlayerQuitEvent. Затем фреймворк должен создавать экземпляры каждого из классов "PlayerLogin" и "PlayerQuit", передавая PlayerHandler в качестве аргумента конструктора. Экземпляры PlayerLogin и PlayerQuit, в свою очередь, будут зарегистрированы в CraftBukkit в качестве прослушивателей событий.

То, как это в настоящее время реализовано с использованием pico, можно увидеть здесь:

https://github.com/Runsafe/Framework/blob/master/src/no/runsafe/framework/event/EventEngine.java#L32

Этот код выглядит ужасно, и я не смог найти более элегантное решение для этого сценария, поэтому я прошу вашего руководства:)

1 ответ

Решение

Ну, я не совсем понимаю ваш вопрос, но я могу объяснить некоторые шаблоны пико-событий.

Прежде всего, события ориентированы на контейнеры, вы не используете pico только для того, чтобы соединить вещи. Каждый потребитель событий добавляется в контейнер. Каждый потребитель должен реализовать по крайней мере один метод для получения события obj. У вас может быть один интерфейс с общим классом события, или у вас может быть много интерфейсов для разных типов событий.

Таким образом, у вас есть список потребителей в контейнере (или несколько списков для нескольких типов событий). Вы можете либо добавить список потребителей в какой-либо объект вещателя событий (очевидно, это делается один раз за создание контейнера, вещатель каким-то образом получает событие откуда-то затем просто перебирает список и вызывает соответствующие методы-обработчики событий) или просто выполняет пользовательский вызов жизненного цикла контейнера (может выполняться в любое время и вызывать потребителей, добавляемых во время выполнения, вызывающее задание выполняется самим контейнером)

Иногда вы можете даже захотеть создать новый контейнер событий для каждого события, добавив событие obj и всех соответствующих потребителей.

Waffle Framework содержит лучшие примеры манипулирования пико-контейнерами, обработкой событий и т. Д.

Другие вопросы по тегам