Event Bus ونمط Observer في Java: تنفيذ بنية غير مترابطة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

Event Bus ونمط Observer في Java: كيفية بناء بنية مرنة للأحداث



في تطوير Java الحديث، غالبًا ما تنشأ الحاجة لإخطار مكونات النظام بأحداث حدثت في مكونات أخرى، دون إنشاء تبعية صلبة بينها. يحل نمط Observer الكلاسيكي هذه المشكلة، لكن تنفيذه يدويًا قد يؤدي إلى تضخم الكود، تسرب الذاكرة، وصعوبات في التصحيح. هنا يأتي دور Event Bus - وهو تطبيق جاهز لنمط "الناشر-المشترك" (Publish-Subscribe)، الذي يتولى إدارة الاشتراكات وتوصيل الأحداث.



في هذه المقالة، سنحلل بالتفصيل ما هو Event Bus، وكيف يرتبط بنمط Observer، وسنعرض مثالًا عمليًا لاستخدام المكتبة الشهيرة greenrobot EventBus لتطبيقات Java. ستكون المادة مفيدة للمطورين الذين يرغبون في إنشاء أنظمة غير مترابطة، سهلة الاختبار، وقابلة للتوسع.



نمط Observer: أساس Event Bus



يحدد نمط Observer علاقة "واحد إلى متعدد" بين الكائنات: عندما يغير كائن واحد (الناشر) حالته، يتم إخطار جميع الكائنات المعتمدة عليه (المشتركون) تلقائيًا. في التنفيذ الكلاسيكي، يحتفظ الناشر بقائمة المشتركين ويستدعي طرقهم مباشرة.



عيوب التنفيذ اليدوي:

  • الارتباط الصلب: يجب على المشترك تنفيذ واجهة Observer بشكل صريح.
  • إدارة دورة الحياة: يجب إلغاء اشتراك المشتركين يدويًا، وإلا فقد يحدث تسرب للذاكرة.
  • صعوبة التوسع: مع زيادة عدد المشتركين، يصبح الكود صعب الصيانة.


يحل Event Bus هذه المشكلات من خلال العمل كوسيط مركزي. الناشر لا يعرف المشتركين -他只是 يرسل الحدث إلى الناقل. الناقل بنفسه يجد جميع المشتركين المسجلين لهذا النوع من الحدث ويوصل لهم الرسالة.



التعرف على greenrobot EventBus



EventBus من greenrobot هي مكتبة خفيفة الوزن لـ Java و Android، تنفذ نمط Observer باستخدام التعليقات التوضيحية (annotations). تتيح لك:

  • إرسال أحداث من أي نوع (فئات POJO).
  • الاشتراك في الأحداث حسب نوع الفئة.
  • اختيار مسار التوصيل: الرئيسي (UI)، الخلفي، أو ما بعد التدفق.
  • استخدام أولويات المشتركين وإلغاء الأحداث.


مثال على استخدام EventBus



لنفكر في مثال بسيط: المكون SensorManager يولد أحداثًا حول تغير درجة الحرارة، ومكونان آخران - Logger و AlertSystem - يستجيبان لها.



الخطوة 1: تعريف الحدث

الحدث هو فئة Java عادية تحمل البيانات:

public class TemperatureEvent {    private final double temperature;    private final String sensorId;

public TemperatureEvent(double temperature, String sensorId) { this.temperature = temperature; this.sensorId = sensorId; }

public double getTemperature() { return temperature; } public String getSensorId() { return sensorId; }}


الخطوة 2: إنشاء المشتركين

يتم تسجيل المشتركين في EventBus ويضعون علامة على طرق المعالجة بالتعليق التوضيحي @Subscribe:

import org.greenrobot.eventbus.EventBus;import org.greenrobot.eventbus.Subscribe;

public class Logger { public void start() { EventBus.getDefault().register(this); }

@Subscribe public void onTemperatureEvent(TemperatureEvent event) { System.out.println("[LOG] Sensor " + event.getSensorId() + ": temperature is " + event.getTemperature() + "°C"); }

public void stop() { EventBus.getDefault().unregister(this); }}

public class AlertSystem { private static final double A

توصيات