Définition: Définissez une dépendance un-à-plusieurs entre les objets, de sorte que lorsque chaque objet modifie son état, tous les objets qui en dépendent seront notifiés et automatiquement mis à jour.
Type: modèle de comportement
Diagramme de classe:
Il y a souvent un besoin dans les systèmes logiciels: si l'état d'un objet change, certains objets qui y sont liés changeront également en conséquence. Par exemple, nous voulons concevoir une fonction de menu avec le bouton droit. Tant que nous cliquons avec le bouton droit dans la zone efficace du logiciel, un menu apparaîtra; Par exemple, nous voulons concevoir une fonction de déploiement automatique, tout comme lorsque Eclipse est développé, tant que le fichier est modifié, Eclipse déploiera automatiquement le fichier modifié sur le serveur. Il existe une similitude entre ces deux fonctions, c'est-à-dire qu'un objet doit toujours surveiller un autre objet, et tant que son état change, il prendra des mesures correspondantes. En fait, il existe de nombreuses solutions qui peuvent y parvenir, mais l'utilisation du modèle d'observateur est sans aucun doute un choix grand public.
La structure du motif d'observateur
Dans le mode d'observateur le plus élémentaire, les quatre caractères suivants sont inclus:
Observer: D'après le diagramme de la classe, vous pouvez voir qu'il y a un conteneur vectoriel dans la classe qui stocke l'objet Observer (la raison pour laquelle le vecteur est utilisé à la place de la liste est parce que lorsque les opérations multi-threadaient, le vecteur est sûr, tandis que la liste n'est pas sûre). Ce conteneur vectoriel est le cœur de la classe Observer. Il existe trois autres méthodes: la méthode d'attache consiste à ajouter l'objet observateur à ce conteneur; La méthode de détachement consiste à supprimer l'objet observateur du conteneur; La méthode de notification consiste à appeler les méthodes correspondantes de l'objet observateur à son tour. Ce rôle peut être une interface, une classe abstraite ou une classe concrète, car dans de nombreux cas, il sera mélangé à d'autres modèles, il y a donc plus de cas d'utilisation de classes abstraites.
Observer: Le rôle d'observateur est généralement une interface, qui n'a qu'une seule méthode de mise à jour. Lorsque l'état de l'observateur change, cette méthode sera appelée.
Observer spécifique: Ce rôle est utilisé pour une expansion facile et une logique métier spécifique peut être définie dans ce rôle.
Observer spécifique: l'implémentation spécifique de l'interface d'observateur. Dans ce rôle, la logique à traiter lorsque l'état de l'objet est observé change.
Exemple d'implémentation en mode observateur
Interface
Sujet de l'interface publique {public void RegisterObserver (Observer O); public void retireobserver (Observer O); public void notifyallobservers ();}Interface d'observateur
Observer d'interface publique {mise à jour du public public (sujet S);}La classe Hunter implémente l'interface du sujet
import java.util.arraylist; Classe publique Le chasseur de têtes implémente le sujet {// Définir une liste d'utilisateurs, tels que Mike, Bill, etc. Private ArrayList <Bosever> UserList; emplois privé ArrayList <string>; public headhunter () {userList = new ArrayList <Bserver> (); jobs = new ArrayList <string> (); } @Override public void registerObserver (Observer O) {userList.add (o); } @Override public void removeObserver (Observer O) {} @Override public void notifyAllObservers () {for (Observer o: userList) {o.update (this); }} public void addJob (String Job) {this.jobs.add (travail); notifyAllObservers (); } public arrayList <string> getJobs () {return jobs; } public String toString () {return jobs.toString (); }}Jobeker est un observateur:
classe publique JobeSeEker implémente l'observateur {nom de chaîne privée; Public JobeKer (String Name) {this.name = name; } @Override public void Update (sujet S) {System.out.println (this.name + "Got Notifié!"); // Imprimer la liste de travaux System.out.println (s); }}Commencer:
classe publique Main {public static void main (String [] args) {headhunter hh = new headhunter (); HH.RegisterObserver (nouveau travail de travail ("Mike")); HH.RegisterObserver (nouveau travail d'emploi ("Chris")); HH.RegisterObserver (nouveau travail de travail ("Jeff")); // Chaque fois que vous ajoutez un emploi, tous les travaux peuvent être informés. HH.AddJob ("Google Job"); HH.Addjob ("Yahoo Job"); }} Avantages du mode observateur
L'observateur et l'observateur sont légèrement liés et sont abstraits, de sorte qu'il est plus facile de se développer pour les deux.
Le mode observateur est un mécanisme de déclenchement couramment utilisé, qui forme une chaîne de déclenchement et traite à son tour les méthodes de chaque observateur. Mais en même temps, c'est aussi un inconvénient du mode observateur. Puisqu'il est déclenché dans une chaîne, lorsqu'il y a beaucoup d'observateurs, le problème de performance est plus inquiétant. De plus, dans la structure de la chaîne, les erreurs de référence circulaires sont plus susceptibles de se produire, provoquant la tracture du système.
Résumer
Dans la langue Java, il y a un observateur d'interface, et sa classe d'implémentation observable, qui met souvent en œuvre le rôle d'observateur. Nous pouvons voir les méthodes d'utilisation de ces deux classes dans la documentation de l'API JDK.
Les amis qui ont fait VC ++, JavaScript Dom ou AWT Development sont tous incroyables dans leur traitement d'événements. Après avoir compris le modèle d'observateur, ils ont une certaine compréhension des principes du mécanisme de traitement des événements. Si vous souhaitez concevoir une fonction d'un mécanisme de traitement de déclenchement d'événements, l'utilisation du mode observateur est un bon choix. Le traitement d'événements Dem (modèle d'événement de délégation) dans AWT est implémenté à l'aide du mode observateur.