23 أنماط التصميم الفصل 13: نمط جافا المراقب
التعريف: تحديد التبعية الواحدة بين الكائنات ، بحيث عندما يغير كل كائن حالته ، سيتم إخطار جميع الكائنات التي تعتمد عليها وتحديثها تلقائيًا.
النوع: نمط سلوكي
مخطط الفصل:
غالبًا ما تكون هناك حاجة في أنظمة البرمجيات: إذا تغيرت حالة الكائن ، فإن بعض الكائنات المتعلقة به ستتغير أيضًا وفقًا لذلك.
على سبيل المثال ، نريد تصميم وظيفة قائمة النقر بزر الماوس الأيمن. طالما أننا نقرر بزر الماوس الأيمن في المنطقة الفعالة للبرنامج ، ستظهر القائمة ؛
على سبيل المثال ، نحتاج إلى تصميم وظيفة نشر تلقائية ، تمامًا كما هو الحال عند تطوير Eclipse ، طالما تم تعديل الملف ، فإن Eclipse سيقوم تلقائيًا بنشر الملف المعدل على الخادم.
هناك تشابه بين هاتين الوظيفتين ، أي ، يجب أن يراقب كائن واحد دائمًا كائنًا آخر ، وطالما يتغير حالته ، فإنه سيتخذ الإجراءات المقابلة. في الواقع ، هناك العديد من الحلول التي يمكن أن تحقق ذلك ، ولكن استخدام نموذج المراقب هو بلا شك خيار رئيسي.
هيكل نمط المراقب
في وضع المراقب الأساسي ، يتم تضمين الأحرف الأربعة التالية:
المراقب: من مخطط الفصل الدراسي ، يمكنك أن ترى أن هناك حاوية ناقلات في الفصل تخزن كائن المراقب (السبب في استخدام المتجه بدلاً من القائمة هو أن هناك الكثير
عند الترابط ، يكون المتجه آمنًا ، على الرغم من أن القائمة غير آمنة) ، فإن حاوية المتجه هذه هي جوهر فئة المراقب ، وهناك ثلاث طرق أخرى: طريقة الإرفاق هي إضافة كائن مراقب إلى هذه الحاوية ؛ طريقة الفصل هي إزالة كائن المراقب من الحاوية ؛ طريقة الإخطار هي استدعاء الطرق المقابلة لكائن المراقب بدوره. يمكن أن يكون هذا الدور واجهة أو فئة مجردة أو فئة ملموسة ، لأنه في كثير من الحالات سيتم خلطه مع أنماط أخرى ، لذلك هناك المزيد من حالات استخدام الفئات المجردة.
المراقب: دور المراقب هو عمومًا واجهة ، والتي تحتوي على طريقة تحديث واحدة فقط. عندما تتغير حالة المراقب ، سيتم استدعاء هذه الطريقة.
مراقب محدد: يتم استخدام هذا الدور لسهولة التوسع ، ويمكن تعريف منطق العمل المحدد في هذا الدور.
مراقب محدد: التنفيذ المحدد لواجهة المراقب. في هذا الدور ، يتم معالجة المنطق عند تغيير حالة الكائن الذي يتم ملاحظته.
تنفيذ رمز وضع المراقب
موضوع الفئة التجريدية العامة {private vector <S0erver> obs = new Vector <Seberver> () ؛ public void addobserver (observer obs) {this.obs.add (obs) ؛ } public void delobserver (observer obs) {this.obs.remove (obs) ؛ } void protected notifyObserver () {for (observer o: obs) {o.update () ؛ }} Public Abstract void dosomething () ؛ } يمتد concretesubject من الفئة العامة الموضوع {public void dosomething () {system.out.println ("تم إرجاعه بواسطة حدث Observer") ؛ this.notifyObserver () ؛ }} الواجهة العامة Observer {public void update () ؛ } الطبقة العامة ConcreteObserver1 تنفذ Observer {public void update () {system.out.println ("Observer 1 يتلقى الرسالة ويعالجها.") ؛ }} الفئة العامة ConcreteObserver2 تنفذ Observer {public void update () {system.out.println ("Observer 2 يتلقى الرسالة ويعالجها.") ؛ }} عميل الفئة العامة {public static void main (string [] args) {الموضوع الفرعي = concretesubject () ؛ sub.addobserver (concreteObserver1 () جديد) ؛ // إضافة Observer1 Sub.AdDobserver (New ConcretEbserver2 ()) ؛ // إضافة Observer2 sub.dosomething () ؛ }} نتائج التشغيل
يتم عكس حدث المراقب ويتلقى المراقب 1 المعلومات ويعالجها.
يحصل Observer 2 على المعلومات ويعالجها.
من خلال نتائج التشغيل ، يمكننا أن نرى أننا نسمي فقط طريقة الموضوع ، ولكن يتم استدعاء الطرق ذات الصلة لكلا المراقبين في نفس الوقت. إذا نظرت إلى الكود بعناية ، فهذا في الواقع بسيط للغاية. إنه ليس أكثر من مجرد ربط فئة المراقب في فئة الموضوع وتجتاز طريقة تحديث المراقب في طريقة dosomething.
مزايا وضع المراقب
يرتبط المراقب والمراقب بشكل طفيف ويتم ربطهما بشكل مجردة ، بحيث يكون من الأسهل التوسع لكليهما.
وضع المراقب هو آلية مشغل شائعة الاستخدام ، والتي تشكل سلسلة مشغل ويعالج طرق كل مراقب بدوره. ولكن في الوقت نفسه ، هذا أيضًا عيب في وضع المراقب. نظرًا لأنه يتم تشغيله في سلسلة ، عندما يكون هناك العديد من المراقبين ، فإن مشكلة الأداء أكثر إثارة للقلق. علاوة على ذلك ، في بنية السلسلة ، من المرجح أن تحدث الأخطاء المرجعية الدائرية ، مما يؤدي إلى مزيف النظام.
لخص
في لغة Java ، يوجد مراقب واجهة ، وفئة التنفيذ قابلة للملاحظة ، والتي غالباً ما تنفذ دور المراقب. يمكننا عرض طرق استخدام هاتين الفئتين في وثائق JDK API.
الأصدقاء الذين قاموا بتطوير VC ++ أو JavaScript DOM أو AWT كلهم مدهشون حول معالجة الأحداث الخاصة بهم. بعد فهم نمط المراقب ، لديهم فهم معين لمبادئ آلية معالجة الأحداث. إذا كنت ترغب في تصميم وظيفة لآلية المعالجة التي تسبب الحدث ، فإن استخدام وضع المراقب هو خيار جيد. يتم تنفيذ DEM معالجة الأحداث (نموذج حدث التفويض) في AWT باستخدام وضع المراقب.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.