Event Bus и паттерн Observer в Java: руководство с примерами

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Event Bus и паттерн Observer в Java

Современные приложения все чаще строятся на событийно-ориентированной архитектуре. Два ключевых инструмента для реализации такой модели в Java — это паттерн Observer и его эволюция — Event Bus (шина событий). В этой статье мы разберем, чем они отличаются, как реализовать каждый из них, и какие библиотеки помогут упростить разработку.

Что такое паттерн Observer?

Паттерн Observer (Наблюдатель) — это поведенческий шаблон проектирования, при котором один объект (субъект) уведомляет множество зависимых объектов (наблюдателей) об изменении своего состояния. В Java этот паттерн часто используется в графических интерфейсах, системах логирования и обработке событий.

Ключевые компоненты:

  • Subject — источник событий, управляет списком наблюдателей
  • Observer — интерфейс, который реализуют все подписчики
  • ConcreteSubject — конкретная реализация субъекта
  • ConcreteObserver — конкретный наблюдатель

Пример реализации на чистом Java:

// Интерфейс наблюдателя
interface Observer {
    void update(String event);
}

// Интерфейс субъекта
interface Subject {
    void attach(Observer observer);
    void detach(Observer observer);
    void notifyObservers(String event);
}

// Конкретный субъект
class EventManager implements Subject {
    private List<Observer> observers = new ArrayList<>();
    
    @Override
    public void attach(Observer observer) {
        observers.add(observer);
    }
    
    @Override
    public void detach(Observer observer) {
        observers.remove(observer);
    }
    
    @Override
    public void notifyObservers(String event) {
        for (Observer observer : observers) {
            observer.update(event);
        }
    }
    
    public void fireEvent(String event) {
        System.out.println("Событие: " + event);
        notifyObservers(event);
    }
}

// Конкретный наблюдатель
class LogObserver implements Observer {
    @Override
    public void update(String event) {
        System.out.println("Лог: получено событие - " + event);
    }
}

// Использование
public class ObserverDemo {
    public static void main(String[] args) {
        EventManager manager = new EventManager();
        manager.attach(new LogObserver());
        manager.fireEvent("Пользователь вошел в систему");
    }
}

Что такое Event Bus?

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

Преимущества Event Bus:

  • Слабая связанность компонентов
  • Упрощенная подписка и публикация
  • Поддержка фильтрации событий по типу
  • Асинхронная обработка (опционально)

Библиотека Guava EventBus

Google Guava предоставляет мощную реализацию Event Bus. Она широко используется в промышленных проектах и проста в интеграции.

Подключение Maven:

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>33.0.0-jre</version>
</dependency>

Пример использования:

import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;

// Класс события
class UserLoginEvent {
    private final String username;
    
    public UserLoginEvent(String username) {
        this.username = username;
    }
    
    public String getUsername() {
        return username;
    }
}

// Подписчик
class EventListener {
    @Subscribe
    public void handleUserLogin(UserLoginEvent event) {
        System.out.println("Пользователь " + event.getUsername() + " вошел в систему");
    }
    
    @Subscribe
    public void handleAnyEvent(Object event) {
        System.out.println("Получено событие: " + event.getClass().getSimpleName());
    }
}

// Главный класс
public class EventBusDemo {
    public static void main(String[] args) {
        EventBus eventBus = new EventBus("mainBus");
        EventListener listener = new EventListener();
        
        eventBus.register(listener);
        eventBus.post(new UserLoginEvent("admin"));
        eventBus.post("Простое строковое сообщение");
        
        eventBus.unregister(listener);
    }
}

Сравнение: Observer vs Event Bus

<

Рекомендаций

Характеристика Observer Event Bus
Связанность Высокая (субъект знает о наблюдателях) Низкая (через шину)