يعد وضع Observer أحد أوضاع تصميم البرامج ويستخدم أيضًا بشكل شائع ، خاصة في برمجة واجهة المستخدم الرسومية. هناك العديد من المقالات حول أنماط التصميم المكتوبة على الإنترنت ، والعديد من المقالات مكتوبة بشكل جيد. على الرغم من وجود شك في تكرار العجلة المبكرة ، فإن هذه العجلة ليست العجلة الأخرى ، مع تركيز مختلف ، وأفكار مختلفة ، وطرق مختلفة لإخبارها.
العناصر الرئيسية
سمة:
الموضوع هو الكائن الذي لاحظه المراقب. يجب أن يكون للموضوع الخصائص الثلاث التالية.
المراقب:
عندما يتغير الموضوع ، فإن تلقي الإشعارات لمعالجة محددة هو ميزة يجب أن يكون لدى المراقب.
لماذا تستخدم هذا الوضع
فيما يلي مثال لتوضيح أن محطة توصيل الحليب هي الموضوع. عميل الاشتراك في الحليب هو الشاشة. بعد أن يشترك العميل في الحليب من محطة توصيل الحليب ، سيتلقى الحليب كل يوم. إذا كان العميل لا يرغب في الاشتراك ، فيمكنه الإلغاء ولن يتلقى الحليب في المستقبل.
اقتران فضفاض
يضيف المراقب أو يحذف الكود دون تعديل الموضوع ، ما عليك سوى استدعاء الطريقة المقابلة لإضافة أو حذف الموضوع.
الموضوع مسؤول فقط عن إخطار المراقب ، لكنه لا يحتاج إلى معرفة كيفية تعامل المراقب مع الإخطار. على سبيل المثال ، تكون محطة توصيل الحليب مسؤولة فقط عن توصيل الحليب ولا تهتم بما إذا كان العميل يشربها أو يغسل وجهه.
يحتاج المراقب فقط إلى انتظار إخطار الموضوع ، دون مراقبة التفاصيل المتعلقة بالموضوع. بالنسبة إلى نفس المثال ، يحتاج العملاء فقط إلى الاهتمام بمحطة توصيل الحليب لتسليم الحليب ، وليس عن أي نوع من النقل أو نوع النقل لتوصيل الحليب.
Java تنفذ وضع المراقب
1. تنفيذ جافا الخاص
الرسم البياني الفئة
/ ** * يرث هدف الملاحظة من java.util.Observable * Author Stone * */ updateObsablable Expressovable يمتد {private int data ؛ Public UpdateObservable (Observer Observer) {AddObserver (Observer) ؛ / * * إضافة مراقب آخر */} public int getData () {return data ؛ } public void setData (int data) {if (data! = this.data) {this.data = data ؛ setChanged () ؛ // تغييرات العلامة ، eletforeBservers () ؛ // الإخطار}} Override public void addobserver (observer o) {super.addobserver (o) ؛ } Override public synchronized void deleteobserver (observer o) {super.deleteObserver (o) ؛ } Override public void notifyObservers () {super.notifyObservers () ؛ } Override public void notifyObservers (Object arg) {super.notifyObservers (arg) ؛ } Override public synchronized void deleteObservers () {super.deleteObservers () ؛ } override محمية setChanged () {super.setchanged () ؛ } override محمية متزامنة void clochanged () {super.clearchanged () ؛ } Override Public Synchronized Boolean haschanged () {return super.haschanged () ؛ } Override Public Synchronized intoBservers () {return super.countobservers () ؛ }} / ** * Observer تنفذ java.util.Observer واجهة * Author Stone * */ public class updateObserver تنفذ Observer {Override public void تحديث (Objectable O ، Object Arg) if (o extureof updateObservable) {updateObservable uo = (updateObservable) o ؛ system.out.print ("تم تغيير البيانات إلى:" + uo.getData ()) ؛ }}} 2. نموذج المراقبة المخصص
الرسم البياني الفئة
/ ** * مراقب مجردة * تحديث المراقبة * Author Stone * */ الواجهة العامة iwatcher {/ * * واجهة الإخطار: * 1. الإخطار البسيط * 2. تحديث باطل () ؛ } / ** * موضوع الهدف المجردة * يوفر واجهة لتسجيل وحذف كائنات المراقب ، وواجهة لإخطار المراقبين بالمراقبة * والواجهة التي يتم ملاحظتها للهدف * @Author Stone * */ Interface Public IwatchedSubject {public void add (ساعة iwatcher) ؛ إزالة الفراغ العام (ساعة iwatcher) ؛ الفراغ العام إخطار Whatchatchers () ؛ تحديث الفراغ العام () ؛ // واجهة للتغييرات التجارية المرصودة} / ** * مراقب محدد مراقب الخرسانة * * Author Stone * */ الفئة العامة تحديث Watcher ينفذ iWatcher {Override public void update () {system.out.println (this + "تمت ملاحظته: تم تحديث الهدف") ؛ }} / ** * دور مستهدف محدد للدور الملموس * Author Stone * */ public class updateWatchedSubject تنفذ iWatchedSubject {private list <Iwatcher> list ؛ Public UpdateWatchedSubject () {this.list = new ArrayList <iWatcher> () ؛ } Override public void add (iwatcher watch) {this.list.add (watch) ؛ } override public void remove (watcher watch) {this.list.remove (watch) ؛ } Override public void notifywhatchers () {for (iwatcher watcher: list) {watcher.update () ؛ }} Override public void update () {system.out.println ("Target Update ......") ؛ إعلام Whatchers () ؛ }} المستمع هو تنفيذ المراقب:
الرسم البياني الفئة
/ ** * مستمع بعد التسجيل * Author Stone * */ public interface IregisterListener {void onregistered () ؛ } / ** * المستمع عندما يسجل المستخدم في * Author Stone * */ واجهة عامة IloginListener {void onLogined () ؛ } /** المستمع هو تطبيق لوضع المراقب* إضافة مستمعين إلى بعض واجهات الأعمال التي تتطلب الاستماع ، اتصل بالطرق المقابلة للمستمع لتنفيذ مستخدم الاستماع*/ الفئة العامة {سجل الفراغ العام (IREGisterListener Record) {/** do ... register*/ system.out.out.println ("" التسجيل ... ") ؛ // بعد تسجيل التسجيل. } تسجيل الدخول باطل عام (تسجيل الدخول iloginListener) { / * * do ... تسجيل الدخول * / system.out.println ("التسجيل ...") ؛ // بعد login.onlogined () ؛ }} /*** نمط Observer Mode السلوكي* يحدد وضع Observer تبعية أحادية إلى أقصى ، مما يسمح لعدة كائنات مراقب متعددة بمراقبة كائن مستهدف في نفس الوقت. * عندما يتغير هذا الكائن الهدف في حالته ، فإنه سيخطر جميع كائنات المراقب ، حتى يتمكنوا من تحديث أنفسهم تلقائيًا. يحتاج الكائن الهدف إلى واجهة لإضافة وإزالة وإخطار المراقبين * * Author Stone */ اختبار الفئة العامة {public static void main (string [] args) {/ * * استخدم واجهة مراقب Java الخاصة والفئة المرصودة */ updateObservable يمكن ملاحظتها = جديد تحديث (تحديث جديد ()) ؛ قابل للملاحظة. System.out.println ("") ؛ System.out.println ("") ؛ /** نموذج مراقب مخصص*/ iWatchedSubject Watched = جديد UpdateWatchedSubject () ؛ watched.add (جديد updateWatcher ()) ؛ watched.add (جديد updateWatcher ()) ؛ شاهد. update () ؛ System.out.println ("") ؛ /** -listener sub-mode*/ user user = new user () ؛ user.register (new IregisterListener () {Override public void onregistered () {system.out.println ("بعد الاستماع إلى التسجيل ...") ؛}}) ؛ user.login (new IloginListener () {Override public void onlogined () {system.out.println ("بعد الاستماع إلى تسجيل الدخول ...") ؛}}) ؛ }}مطبعة
تلقي إشعار بتغيير البيانات: تم تغيير البيانات إلى: 99 يتم تحديث الهدف ... Observer.updatewatcher@457471e0 لوحظ: تم تحديث الهدف Observer.updatewatcher@5fe04cbf الملاحظة: تم تحديث الهدف ويسجل ... بعد الاستماع إلى التسجيل. . . تسجيل الدخول ... بعد الاستماع إلى تسجيل الدخول. . .