Event Bus und das Observer-Pattern in Java
\n\nModerne Anwendungen werden zunehmend auf einer ereignisgesteuerten Architektur aufgebaut. Zwei Schlüsselwerkzeuge zur Umsetzung dieses Modells in Java sind das Observer-Pattern und seine Weiterentwicklung – der Event Bus (Ereignisbus). In diesem Artikel erläutern wir, worin sie sich unterscheiden, wie Sie jedes einzelne implementieren und welche Bibliotheken die Entwicklung vereinfachen können.
\n\nWas ist das Observer-Pattern?
\n\nDas Observer-Pattern (Beobachter) ist ein Verhaltensentwurfsmuster, bei dem ein Objekt (Subjekt) mehrere abhängige Objekte (Beobachter) über eine Zustandsänderung benachrichtigt. In Java wird dieses Pattern häufig in grafischen Oberflächen, Protokollierungssystemen und der Ereignisverarbeitung verwendet.
\n\nSchlüsselkomponenten:
\n- \n
- Subject – die Ereignisquelle, verwaltet die Liste der Beobachter \n
- Observer – das Interface, das von allen Abonnenten implementiert wird \n
- ConcreteSubject – die konkrete Implementierung des Subjekts \n
- ConcreteObserver – der konkrete Beobachter \n
Beispielimplementierung in reinem Java:
\n\n// Observer-Interface\ninterface Observer {\n void update(String event);\n}\n\n// Subject-Interface\ninterface Subject {\n void attach(Observer observer);\n void detach(Observer observer);\n void notifyObservers(String event);\n}\n\n// Konkretes Subjekt\nclass EventManager implements Subject {\n private List<Observer> observers = new ArrayList<>();\n \n @Override\n public void attach(Observer observer) {\n observers.add(observer);\n }\n \n @Override\n public void detach(Observer observer) {\n observers.remove(observer);\n }\n \n @Override\n public void notifyObservers(String event) {\n for (Observer observer : observers) {\n observer.update(event);\n }\n }\n \n public void fireEvent(String event) {\n System.out.println("Ereignis: " + event);\n notifyObservers(event);\n }\n}\n\n// Konkreter Beobachter\nclass LogObserver implements Observer {\n @Override\n public void update(String event) {\n System.out.println("Log: Ereignis empfangen - " + event);\n }\n}\n\n// Verwendung\npublic class ObserverDemo {\n public static void main(String[] args) {\n EventManager manager = new EventManager();\n manager.attach(new LogObserver());\n manager.fireEvent("Benutzer hat sich angemeldet");\n }\n}\n\nWas ist ein Event Bus?
\n\nEvent Bus (Ereignisbus) ist ein zentralisierter Mechanismus zum Nachrichtenaustausch zwischen Anwendungskomponenten. Im Gegensatz zum klassischen Observer, bei dem das Subjekt die Abonnenten direkt verwaltet, trennt der Event Bus Sender und Empfänger von Ereignissen über einen gemeinsamen Bus.
\n\nVorteile des Event Bus:
\n- \n
- Lockere Kopplung der Komponenten \n
- Vereinfachtes Abonnieren und Veröffentlichen \n
- Unterstützung der Ereignisfilterung nach Typ \n
- Asynchrone Verarbeitung (optional) \n
Die Guava EventBus-Bibliothek
\n\nGoogle Guava bietet eine leistungsstarke Implementierung des Event Bus. Sie wird häufig in industriellen Projekten eingesetzt und ist einfach zu integrieren.
\n\nMaven-Einbindung:
\n<dependency>\n <groupId>com.google.guava</groupId>\n <artifactId>guava</artifactId>\n <version>33.0.0-jre</version>\n</dependency>\n\nAnwendungsbeispiel:
\n\nimport com.google.common.eventbus.EventBus;\nimport com.google.common.eventbus.Subscribe;\n\n// Ereignisklasse\nclass UserLoginEvent {\n private final String username;\n \n public UserLoginEvent(String username) {\n this.username = username;\n }\n \n public String getUsername() {\n