Κοινή χρήση τεχνολογίας

Μοτίβο σχεδίασης - Μοτίβο παρατηρητή

2024-07-08

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1. Η βασική ιδέα του σχεδίου παρατηρητή

Το μοτίβο του Observer είναι επίσης γνωστό ως μοτίβο Δημοσίευσης/Εγγραφής. Το GOF ορίζει το μοτίβο του παρατηρητή ως εξής: Ορίστε μια σχέση εξάρτησης ένα προς πολλά μεταξύ των αντικειμένων, επιτρέποντας σε πολλαπλά αντικείμενα παρατηρητή να εστιάζουν στο ίδιο αντικείμενο ταυτόχρονα Όταν αλλάζει η κατάσταση του αντικειμένου, όλα τα αντικείμενα που εξαρτώνται από αυτό Ενημερώνεται και ενημερώνεται αυτόματα.
Όπως φαίνεται στο παρακάτω σχήμα, το μοτίβο του παρατηρητή περιέχει 5 τύπους αντικειμένων.
Εισαγάγετε την περιγραφή της εικόνας εδώ

  • Διεπαφή στόχου Θέμα: Η διεπαφή στόχου ορίζει τρεις διεπαφές: προσθήκη παρατηρητή attach(), διαγραφή παρατηρητή detach() και ειδοποίηση παρατηρητών notifyObservers(), και ορισμός της δικής της λειτουργίας συνάρτησης λειτουργίας().
  • Αφηρημένη κατηγορία στόχουAbstractSubject: Αυτή η κλάση ορίζει ένα αντικείμενο συλλογής vect παρατηρητών, το οποίο χρησιμοποιείται για την αποθήκευση της λίστας των προστιθέμενων αντικειμένων παρατηρητή και υλοποιεί τρεις συναρτήσεις για ενημέρωση: προσθήκη παρατηρητή attach(), διαγραφή παρατηρητή detach() και ειδοποίηση παρατηρητών notifyObservers() Αυτή η λίστα επίσης. ειδοποιεί όλα τα αντικείμενα παρατηρητή να ενημερωθούν.
  • Συγκεκριμένη κατηγορία στόχου MySubiect: Κληρονομήστε από την αφηρημένη κλάση στόχο AbstractSubiect και γράψτε μια συγκεκριμένη συνάρτηση λειτουργίας για την υλοποίηση της λειτουργίας() Σε αυτή τη συνάρτηση, η notifyObservers() μπορεί να κληθεί να ειδοποιήσει όλους τους παρατηρητές να ενημερώσουν τον εαυτό τους.
  • Διασύνδεση παρατηρητή Παρατηρητής: Καθορίστε μια ενοποιημένη διασύνδεση update() για αντικείμενα που πρέπει να ειδοποιούνται όταν αλλάζει η κλάση προορισμού.
  • συγκεκριμένος παρατηρητής : Μπορούν να οριστούν πολλαπλά αντικείμενα παρατηρητή, όπως Observer1 και Observer2, για τη σύνταξη ενοποιημένων συναρτήσεων ενημέρωσης. Το Client Test μπορεί να εφαρμόσει παρακολούθηση προσθέτοντας έναν παρατηρητή παρατηρητή στην κλάση Subject.

Ας δούμε τη συγκεκριμένη υλοποίηση.

(1) Διασύνδεση παρατηρητή Το Observer.java ορίζει μια ενοποιημένη ενημέρωση διεπαφής ενημέρωσης(). Ο πηγαίος κώδικας του εμφανίζεται στο παρακάτω πρόγραμμα.

package behavior.observer;


/**
* @author Minggg
* 观察者接口
*/
public interface Observer {

	public void update();
}

(2) Η κλάση υλοποίησης παρατηρητή Observer1.java είναι μια συγκεκριμένη υλοποίηση ενός παρατηρητή και η συνάρτηση ενημέρωσης χρησιμοποιείται για την έξοδο μιας συμβολοσειράς στην κονσόλα. Ο πηγαίος κώδικας του εμφανίζεται στο παρακάτω πρόγραμμα.

package behavior.observer;


/**
* @author Minggg
* 具体观察者
*/
public class Observer1 implements Observer {

	public void update(){ 
		System.out.println("观察者1得到通知!");
	}
}

(3) Η κλάση υλοποίησης παρατηρητή Observer2.java είναι μια συγκεκριμένη υλοποίηση άλλου παρατηρητή και η συνάρτηση ενημέρωσης χρησιμοποιείται για την έξοδο μιας συμβολοσειράς στην κονσόλα. Ο πηγαίος κώδικας του εμφανίζεται στο παρακάτω πρόγραμμα.

package behavior.observer;


/**
* @author Minggg
* 具体观察者
*/
public class Observer2 implements Observer {

	public void update(){ 
		System.out.println("观察者2得到通知!");
	}
}

(4) Η παρατηρούμενη διεπαφή Subject.java ορίζει τρεις συναρτήσεις διεπαφής για τους λειτουργικούς παρατηρητές και ορίζει μια συγκεκριμένη διεπαφή λειτουργικής λειτουργίας για να αναπαραστήσει τις δικές της λειτουργίες. Ο πηγαίος κώδικας του εμφανίζεται στο παρακάτω πρόγραμμα.

package behavior.observer;


/**
* @author Minggg
* 被观察者接口
*/
public interface Subject {

	// 增加观察者
	public void attach(Observer observer);
	// 删除观察者
	public void detach(Observer observer);
	// 通知所有观察者
	public void notifyObservers();
	// 自身的操作接口
	public void operation();
}

(5) Η παρατηρούμενη αφηρημένη κλάση AbstractSubject.java παρέχει ένα Vector list vect για αποθήκευση όλων των αντικειμένων παρατηρητή και εγγραφή συναρτήσεων υλοποίησης για τη λειτουργία των αντικειμένων λίστας. Ο πηγαίος κώδικας του εμφανίζεται στο παρακάτω πρόγραμμα.

package behavior.observer;

import java.util.Enumeration;
import java.util.Vector;


/**
* @author Minggg
* 被观察者抽象类
*/
public abstract class AbstractSubject implements Subject {

	private Vector