نمط Observer: إشعارات الأحداث
طبّق Observer لفصل منتجي الأحداث عن مستهلكيها في نظام لأسعار الأسهم
نمط Observer: إشعارات الأحداث درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.
نية Observer
يعرّف Observer، المعروف أيضًا باسم Publish-Subscribe، تبعيةً من واحد إلى كثير: فعندما تتغير حالة الموضوع، يُخطَر جميع المراقبين المسجلين تلقائيًا.
واجهتا الموضوع والمراقب
يتتبع الموضوع قائمةً من المراقبين ويُخطِرهم. وينفّذ المراقبون طريقة update للتفاعل مع الأحداث.
public interface Observer {
void update(String event, Object data);
}
public interface Subject {
void addObserver(Observer o);
void removeObserver(Observer o);
void notifyObservers(String event, Object data);
}الموضوع الفعلي: Stock Ticker
يحتفظ الموضوع بالحالة ويستدعي notifyObservers كلما تغيرت الحالة. كما يدير قائمة المراقبين.
public class StockTicker implements Subject {
private final List<Observer> observers = new ArrayList<>();
private double price;
public void addObserver(Observer o) { observers.add(o); }
public void removeObserver(Observer o) { observers.remove(o); }
public void setPrice(double p) {
this.price = p;
notifyObservers("PRICE_CHANGED", p);
}
public void notifyObservers(String ev, Object data) {
for (Observer o : observers) o.update(ev, data);
}
}المراقبون الفعليون
يتفاعل كل مراقب بطريقة مختلفة مع الإشعار نفسه. ويمكن إضافة مراقبين في وقت التشغيل من دون تعديل الموضوع.
public class AlertSystem implements Observer {
public void update(String ev, Object data) {
if ((double) data < 100) System.out.println("ALERT: Low price!");
}
}
public class Logger implements Observer {
public void update(String ev, Object data) {
System.out.println("LOG: " + ev + " = " + data);
}
}توصيل المراقبين
سجّل المراقبين لدى الموضوع. سيتفاعلون جميعًا عند تغير الموضوع. وألغِ تسجيلهم لإيقاف تلقي التحديثات.
StockTicker ticker = new StockTicker();
ticker.addObserver(new AlertSystem());
ticker.addObserver(new Logger());
ticker.setPrice(95.5); // both observers notifiedjava.util.Observable — مهمل
كان JDK يحتوي على java.util.Observable وjava.util.Observer، لكنهما مهملان منذ Java 9. نفّذ آليتك الخاصة أو استخدم مكتبات تفاعلية مثل RxJava أو Project Reactor.
PropertyChangeListener
توفر Java beans آلية مراقبة مدمجة هي PropertyChangeSupport لمراقبة تغييرات خصائص bean، وتُستخدم بكثرة في Swing وJavaFX.
public class Model {
private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
private int value;
public void addPropertyChangeListener(PropertyChangeListener l) { pcs.addPropertyChangeListener(l); }
public void setValue(int v) {
int old = this.value; this.value = v;
pcs.firePropertyChange("value", old, v);
}
}مراقب وظيفي باستخدام Consumer
استخدم Consumer<T> كمراقب خفيف الوزن بدلًا من واجهة مخصصة، فهو مناسب تمامًا لاستدعاءات الأحداث البسيطة.
List<Consumer<Double>> listeners = new ArrayList<>();
listeners.add(p -> { if (p < 100) System.out.println("Low price"); });
listeners.add(p -> System.out.println("Price: " + p));
double newPrice = 95.5;
listeners.forEach(l -> l.accept(newPrice));Observer مقابل Event Bus
يفصل ناقل الأحداث، مثل Guava EventBus، الموضوع عن المراقب بدرجة أكبر؛ إذ ينشر الموضوع الأحداث إلى الناقل من دون معرفة المستمعين. ويسجل المراقبون اشتراكهم باستخدام تعليقات توضيحية على الطرق.
// Guava EventBus example
EventBus bus = new EventBus();
bus.register(new Logger()); // subscribe
bus.post(new PriceEvent(95.5)); // publishالأمان في Observer مع عدة خيوط
إذا كان من الممكن إضافة المراقبين أو إزالتهم من عدة خيوط، فاحمِ القائمة باستخدام synchronized أو استخدم CopyOnWriteArrayList لأعباء العمل التي تكثر فيها الإشعارات.
private final List<Observer> observers = new CopyOnWriteArrayList<>();تجنب تسرب الذاكرة
تمنع المراجع القوية في قائمة المراقبين جامع القمامة من تحرير الذاكرة. استخدم WeakReference<Observer> أو ألغِ دائمًا تسجيل المراقبين عند عدم الحاجة إليهم.
Observer في أطر العمل الفعلية
يُعد كل من ApplicationEventPublisher في Spring وAndroid LiveData وخصائص JavaFX تطبيقًا لنمط Observer على مستوى تجريد مختلف.
تحقق سريع
ما الفائدة الرئيسية لنمط Observer؟
مراجعة
يعرّف Observer سلسلة إشعارات من واحد إلى كثير. ويمكن تنفيذه باستخدام الواجهات أو المستهلكين الوظيفيين. استخدم CopyOnWriteArrayList للأمان مع عدة خيوط، وألغِ دائمًا تسجيل المراقبين لمنع التسربات.
الأسئلة الشائعة
هل درس «نمط Observer: إشعارات الأحداث» مجاني؟
نعم — نص درس «نمط Observer: إشعارات الأحداث» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.
ماذا ستتعلم في «نمط Observer: إشعارات الأحداث»؟
طبّق Observer لفصل منتجي الأحداث عن مستهلكيها في نظام لأسعار الأسهم تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟
لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «نمط Observer: إشعارات الأحداث»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟
نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- نمط Observer: إشعارات الأحداث
- نمط Strategy: خوارزميات قابلة للتبديل
- نمط Command: تغليف الإجراءات
- نمط Template Method: تعريف هياكل الخوارزميات