التعريف: تحديد التبعية الواحدة بين الكائنات ، بحيث عندما يغير كل كائن حالته ، سيتم إخطار جميع الكائنات التي تعتمد عليها وتحديثها تلقائيًا.
النوع: نمط سلوكي
مخطط الفصل:
غالبًا ما تكون هناك حاجة في أنظمة البرمجيات: إذا تغيرت حالة الكائن ، فإن بعض الكائنات المتعلقة به ستتغير أيضًا وفقًا لذلك. على سبيل المثال ، نريد تصميم وظيفة قائمة النقر بزر الماوس الأيمن. طالما أننا نقرر بزر الماوس الأيمن في المنطقة الفعالة للبرنامج ، ستظهر القائمة ؛ على سبيل المثال ، نريد تصميم وظيفة النشر التلقائي ، تمامًا كما هو الحال عند تطوير Eclipse ، طالما تم تعديل الملف ، فإن Eclipse ستنشر تلقائيًا الملف المعدل على الخادم. هناك تشابه بين هاتين الوظيفتين ، أي ، يجب أن يراقب كائن واحد دائمًا كائنًا آخر ، وطالما يتغير حالته ، فإنه سيتخذ الإجراءات المقابلة. في الواقع ، هناك العديد من الحلول التي يمكن أن تحقق ذلك ، ولكن استخدام نموذج المراقب هو بلا شك خيار رئيسي.
هيكل نمط المراقب
في وضع المراقب الأساسي ، يتم تضمين الأحرف الأربعة التالية:
المراقب: من مخطط الفصل الدراسي ، يمكنك أن ترى أن هناك حاوية متجهة في الفصل تخزن كائن المراقب (السبب في استخدام المتجه بدلاً من القائمة هو أنه عندما تكون العمليات متعددة الخيوط آمنة ، في حين أن القائمة غير آمنة). حاوية المتجه هذه هي جوهر فئة المراقب. هناك ثلاث طرق أخرى: طريقة الإرفاق هي إضافة كائن المراقب إلى هذه الحاوية ؛ طريقة الفصل هي إزالة كائن المراقب من الحاوية ؛ طريقة الإخطار هي استدعاء الطرق المقابلة لكائن المراقب بدوره. يمكن أن يكون هذا الدور واجهة أو فئة مجردة أو فئة ملموسة ، لأنه في كثير من الحالات سيتم خلطه مع أنماط أخرى ، لذلك هناك المزيد من حالات استخدام الفئات المجردة.
المراقب: دور المراقب هو عمومًا واجهة ، والتي تحتوي على طريقة تحديث واحدة فقط. عندما تتغير حالة المراقب ، سيتم استدعاء هذه الطريقة.
مراقب محدد: يتم استخدام هذا الدور لسهولة التوسع ، ويمكن تعريف منطق العمل المحدد في هذا الدور.
مراقب محدد: التنفيذ المحدد لواجهة المراقب. في هذا الدور ، يتم معالجة المنطق عند تغيير حالة الكائن الذي يتم ملاحظته.
مثال تنفيذ وضع المراقب
واجهة الموضوع
واجهة عامة موضوع {public void registerObserver (Observer O) ؛ public void remostobserver (Observer O) ؛ void public notifyallobservers () ؛}واجهة المراقب
Onterface Observer {public void update (الموضوع S) ؛}تنفذ فئة الصياد واجهة الموضوع
استيراد java.util.arraylist ؛ يقوم HeadHunter Public بتنفيذ الموضوع {// تحديد قائمة المستخدمين ، مثل Mike ، Bill ، إلخ. arraylist private <string> Jobs ؛ Public HeadHunter () {userList = new ArrayList <Seborver> () ؛ الوظائف = ArrayList جديد <string> () ؛ } Override public void registerObserver (Observer O) {userList.add (o) ؛ } Override public void removeObserver (Observer O) {} Override public void electionAllObservers () {for (observer o: userlist) {o.update (this) ؛ }} public void addjob (سلسلة المهمة) {this.jobs.add (Job) ؛ إخطار allobservers () ؛ } ArrayList Public <Tring> getJobs () {return Jobs ؛ } السلسلة العامة toString () {return jobs.toString () ؛ }}الباحث عن عمل هو مراقب:
الباحث عن العمل في الطبقة العامة ينفذ Observer {اسم السلسلة الخاصة ؛ Public Jobseeker (اسم السلسلة) {this.name = name ؛ } Override public void update (الموضوع s) {system.out.println (this.name + "GUT Asstract!") ؛ // طباعة قائمة الوظائف system.out.println (s) ؛ }}ابدأ:
الفئة العامة الرئيسية {public static void main (string [] args) {headhunter hh = new HeadHunter () ؛ HH.RegisterObserver (New Jobseeker ("Mike")) ؛ HH.RegisterObserver (New Jobseeker ("Chris")) ؛ HH.RegisterObserver (New Jobsker ("Jeff")) ؛ // في كل مرة تضيف فيها وظيفة ، يمكن إخطار جميع الوظائف. hh.addjob ("Google Job") ؛ hh.addjob ("Yahoo Job") ؛ }} مزايا وضع المراقب
يرتبط المراقب والمراقب بشكل طفيف ويتم ربطهما بشكل مجردة ، بحيث يكون من الأسهل التوسع لكليهما.
وضع المراقب هو آلية مشغل شائعة الاستخدام ، والتي تشكل سلسلة من الزناد وتعالج طرق كل مراقب بدوره. ولكن في الوقت نفسه ، هذا أيضًا عيب في وضع المراقب. نظرًا لأنه يتم تشغيله في سلسلة ، عندما يكون هناك العديد من المراقبين ، فإن مشكلة الأداء أكثر إثارة للقلق. علاوة على ذلك ، في بنية السلسلة ، من المرجح أن تحدث الأخطاء المرجعية الدائرية ، مما يؤدي إلى مزيف النظام.
لخص
في لغة Java ، يوجد مراقب واجهة ، وفئة التنفيذ قابلة للملاحظة ، والتي غالباً ما تنفذ دور المراقب. يمكننا عرض طرق استخدام هاتين الفئتين في وثائق JDK API.
الأصدقاء الذين قاموا بتطوير VC ++ أو JavaScript DOM أو AWT كلهم مدهشون حول معالجة الأحداث الخاصة بهم. بعد فهم نمط المراقب ، لديهم فهم معين لمبادئ آلية معالجة الأحداث. إذا كنت ترغب في تصميم وظيفة لآلية المعالجة التي تسبب الحدث ، فإن استخدام وضع المراقب هو خيار جيد. يتم تنفيذ DEM معالجة الأحداث (نموذج حدث التفويض) في AWT باستخدام وضع المراقب.