يمتد نمط المراقب في دلفي إلى نمط المراقب الأساسي. لمزيد من المعلومات حول وضع المراقب، يرجى الرجوع إلى [Gam+، الصفحات 293..303]
تحديد علاقة تبعية رأس بأطراف بين الكائنات عندما تتغير حالة الكائن، يتم إعلام كافة الكائنات التي تعتمد عليه وتحديثها تلقائيًا.
إن تقسيم النظام إلى سلسلة من الفئات المتعاونة له آثار جانبية معينة: يجب حماية الاتساق بين الكائنات المترابطة. لا نريد ربط الأنواع بإحكام من أجل اتساق الأبعاد، لأن هذا يقلل من إمكانية إعادة استخدامها. [غام+، ص293].
تسمح لك أحداث دلفي (عناوين الطريقة الفعلية) بالحصول على بنية جيدة للتعامل مع هذه المشكلات. تتيح لك الأحداث التخلص من الاقتران وتحقيق اقتران أفضل. على سبيل المثال: يتم إرسال الحدث TButton.OnClick لإكمال العمل ذي الصلة. لكن الفصل لا يحفظ مرجعًا إلى معالج الحدث. في نمط المراقب، تسمى الفئة التي ترسل الحدث الكائن الهدف (الموضوع)، وتسمى الفئة التي تتحكم في الحدث المراقب (المراقب)
يمكن للأحداث في دلفي القضاء على اقتران الفئات بشكل أفضل. إذا كنت تريد التحكم في أحداث متعددة والإشارة إلى وضع المراقب، فيمكنك إنشاء آلية إعلام واحد إلى متعدد. يمكن أن يكون للهدف أي عدد من المراقبين. يتلقى جميع المراقبين إشعارات عندما تتغير حالة الهدف. بعد أن يتلقى المراقب الإشعار، فإنه يستعلم على الفور عن الكائن الهدف للحفاظ على التزامن مع الكائن الهدف.
ويسمى هذا التفاعل أيضًا النشر والاشتراك، والهدف هو ناشر الإشعار. لا تحتاج إلى معرفة من هم مراقبوها عندما تكتشف إشعارًا. يمكن لأي عدد من المراقبين الاشتراك وتلقي الإخطارات.
سيوفر لك تطبيق وضع المراقب هذا مزايا آلية حدث دلفي في التعامل مع اقتران الفئة. تقوم الهياكل الفردية بتسجيل المراقبين من خلال التسجيل وإلغاء التسجيل. يتم تطبيق آلية واحد لكثير فعليًا على أساس التكرارات.
لنفترض أن لديك فئة Tsubject التي تحدد السلوك الهادف. دعونا نلقي نظرة أولاً على الكود التجريبي لوضع المراقب:
يكتب
TSubject = الفئة (TObject)
خاص
FObservers: TList؛
عام
الإجراء RegisterObserver(Observer: TSubjectObserver);
الإجراء UnregisterObserver(Observer: TSubjectObserver);
نهاية؛
TSubjectObserver = الفئة (TComponent)
خاص
FEnabled: منطقية؛
نشرت
تمكين الخاصية: قراءة منطقية FEnabled كتابة FEnabled الافتراضي صحيح؛
نهاية؛
من بين الواجهات المذكورة أعلاه:
آلية التسجيل لتسجيل المراقبين للموضوع .
¨ FObservers: TList يخزن المراقبين المسجلين.
¨ يتم استخدام RegisterObserver(..) لتسجيل المراقبين وإضافتهم إلى Fobservers.
¨ يتم استخدام UnregisterObserver(..) لإلغاء تسجيل المراقب وإزالة الكائنات ذات الصلة من Fobservers.
?يحتاج وضع المراقب أيضًا إلى إنشاء فئة جديدة TsubjectObserver
¨ هذه الفئة هي سليل Tcomponent.
¨ .خاصية ممكّنة تقوم بتعيين المراقبة أو إيقاف تشغيلها. .
التطبيق الفعلي لوضع المراقب التالي:
الإجراء TSubject.RegisterObserver(Observer: TSubjectObserver);
يبدأ
إذا FObservers.IndexOf(Observer) = -1 إذن
FObservers.Add(Observer);
نهاية؛
الإجراء TSubject.UnregisterObserver(Observer: TSubjectObserver);
يبدأ
FObservers.Remove(Observer);
نهاية؛
تنفيذ Shangguan يدعم الجزء المتعلق بتسجيل المراقبين. أين توجد آلية الإخطار من واحد إلى متعدد؟ بالنسبة لتطبيقات الإشعارات الفعلية من واحد إلى متعدد، يمكنك تحديد طريقة تغيير لـ Tsubject لإعلام المراقبين المسجلين، ويمكن للمراقب تحديد سمة حدث OnChange للتعامل مع الجدولة. الرمز هو كما يلي:
يكتب
TSubject = الفئة (TObject)
خاص
FObservers: TList؛
محمي
» تغيير الإجراء {اتصل بهذه الطريقة لإرسال الإشعار}
عام
الإجراء RegisterObserver(Observer: TSubjectObserver);
الإجراء UnregisterObserver(Observer: TSubjectObserver);
نهاية؛
TSubjectObserver = الفئة (TComponent)
خاص
FEnabled: منطقية؛
»FOnChange: TNotifyEvent;
محمي
» تغيير الإجراء؛
نشرت
تمكين الخاصية: قراءة منطقية FEnabled كتابة FEnabled؛
» الخاصية OnChange: TNotifyEvent قراءة FOnChange كتابة FOnChange؛
نهاية؛
تطبيق
الإجراء TSubject.Change;
فار
» Obs: TSubjectObserver؛
» أنا: عدد صحيح؛
يبدأ
» بالنسبة لي := 0 إلى FObservers.Count - 1 do
" يبدأ
» Obs := FObservers[I];
»إذا كان Obs.Enabled ثم Obs.Change؛
" نهاية؛
نهاية؛
الإجراء TSubject.RegisterObserver(Observer: TSubjectObserver);
يبدأ
إذا FObservers.IndexOf(Observer) = -1 إذن
FObservers.Add(Observer);
نهاية؛
الإجراء TSubject.UnregisterObserver(Observer: TSubjectObserver);
يبدأ
FObservers.Remove(Observer);
نهاية؛
الإجراء TSubjectObserver.Change;
يبدأ
»إذا تم تعيينه (FOnChange) ثم FOnChange (Self)؛
نهاية؛
في رمز التنفيذ أعلاه:
?تتكرر طريقة التغيير الخاصة بـ Tsubject عبر جميع المراقبين المسجلين وتستدعي طريقة التغيير لكل مراقب، وهي عبارة عن تنفيذ إعلام واحد لكثير.
تحدد الخاصية "ممكّن" للمراقب ما إذا كان يتلقى إشعارات أم لا
يعالج الحدث OnChange الخاص بـ TsubjectObserver المزامنة والعمليات الأخرى فعليًا.
تنظيم
// مقتطفات كثيرة من "أنماط التصميم"