Настройка нескольких декораторов с пико-контейнером
Я использовал пико-контейнер в 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 содержит лучшие примеры манипулирования пико-контейнерами, обработкой событий и т. Д.