تنفيذ نمط المراقب المخصص في جافا بدون مكتبات مدمجة
مقدمة حول نمط المراقب (Observer Pattern)
في عالم تطوير البرمجيات، يعتبر نمط المراقب (Observer Pattern) من الأنماط الأساسية في البرمجة كائنية التوجه (OOP). يتيح هذا النمط إمكانية تفاعل الكائنات مع بعضها البعض بطريقة فعالة، حيث يتمكن كائن واحد (الموضوع) من إبلاغ مجموعة من الكائنات الأخرى (المراقبون) عن أي تغييرات تحدث. في هذا المقال، سوف نستعرض كيفية تنفيذ نمط المراقب المخصص في لغة Java، دون الاعتماد على المكتبات المدمجة مثل java.util.Observer
أو PropertyChangeSupport
.
الخطوة 1: تعريف واجهة المراقب
للبدء، نقوم بتعريف واجهة للمراقب. هذه الواجهة ستحتوي على طريقة واحدة تُسمى update
، والتي تُستخدم لإبلاغ المراقب بالتحديثات الجديدة. عينة الكود لطريقة التعريف ستبدو كالتالي:
public interface Observer {
void update(String message); // يحصل المراقب على إشعار
}
الخطوة 2: تعريف واجهة الموضوع
بعد ذلك، نقوم بإنشاء واجهة الموضوع. تحتوي هذه الواجهة على مجموعة من الطرق، مثل تسجيل المراقب، إلغاء تسجيله، وإخطار جميع المراقبين بالتحديثات. هنا هو الكود الخاص بذلك:
public interface Subject {
void registerObserver(Observer observer);
void unregisterObserver(Observer observer);
void notifyObservers(String message);
}
الخطوة 3: تنفيذ الموضوع الملموس
نستمر في تنفيذ نمط المراقب من خلال إنشاء فئة معينة تمثل الموضوع. سنقوم بتخزين قائمة بالمراقبين داخل هذه الفئة وإشعارهم بالتغييرات عند الحاجة. إليك كيف ستبدو البنية الأساسية لهذه الفئة:
import java.util.ArrayList;
import java.util.List;
public class ConcreteSubject implements Subject {
private final List<Observer> observers = new ArrayList<>(); // قائمة لتخزين المراقبين
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void unregisterObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers(String message) {
for (Observer observer : observers) {
observer.update(message); // قم بإخطار كل مراقب
}
}
}
الخطوة 4: تنفيذ المراقب الملموس
الآن نأتي إلى إنشاء فئة تمثل المراقب. سنقوم بتعريف خاصية اسم فريدة لكل مراقب وسنقوم بتنفيذ طريقة update
لكي يقوم المراقب بطباعة التحديثات الواردة. الكود التالي يوضح ذلك:
public class ConcreteObserver implements Observer {
private final String name;
public ConcreteObserver(String name) {
this.name = name;
}
@Override
public void update(String message) {
System.out.println(name + " received update: " + message);
}
}
اختبار نمط المراقب
يمكننا الآن اختبار هذا النمط من خلال تنفيذ كود رئيسي يقوم بإنشاء موضوع و مراقبين، وتسجيلهم، وإخطارهم بالتحديثات. هنا هو الشرح خطوة بخطوة:
public class ObserverPatternTest {
public static void main(String[] args) {
// إنشاء الموضوع
ConcreteSubject subject = new ConcreteSubject();
// إنشاء مراقبين
Observer observer1 = new ConcreteObserver("Observer 1");
Observer observer2 = new ConcreteObserver("Observer 2");
Observer observer3 = new ConcreteObserver("Observer 3");
// تسجيل المراقبين
subject.registerObserver(observer1);
subject.registerObserver(observer2);
subject.registerObserver(observer3);
// إخطار المراقبين
System.out.println("تغيير الحالة للمرة الأولى .....");
subject.notifyObservers("التحديث الأول");
// إلغاء تسجيل مراقب وإرسال إشعار آخر
subject.unregisterObserver(observer2);
System.out.println("تغيير الحالة للمرة الثانية .....");
subject.notifyObservers("التحديث الثاني");
}
}
النتائج المتوقعة
عند تشغيل البرنامج سيظهر الإخراج كالتالي:
تغيير الحالة للمرة الأولى .....
Observer 1 received update: التحديث الأول
Observer 2 received update: التحديث الأول
Observer 3 received update: التحديث الأول
تغيير الحالة للمرة الثانية .....
Observer 1 received update: التحديث الثاني
Observer 3 received update: التحديث الثاني
خاتمة
في هذا المقال، قدمنا لك وسيلة بسيطة ومباشرة لتنفيذ نمط المراقب المخصص في Java. استخدام الأنماط كائنية التوجه يعزز من مرونة الكود وقابليته للتطوير. من المهم فهم كيفية عمل هذا النمط وكيفية تطبيقه في مشاريعك الخاصة لتحسين التفاعل بين الكائنات.
يمكنك استخدام هذه الأفكار لتحسين تطبيقاتك وجعلها أكثر احترافية وتفاعلاً. تجربة نمط المراقب المخصص يساعدك أيضاً في تعزيز مهاراتك في البرمجة كائنية التوجه.