23 Modèles de conception Chapitre 13: Modèle d'observateur Java
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 devons 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 classe, vous pouvez voir qu'il y a un conteneur vectoriel dans la classe qui stocke l'objet Observer (la raison pour laquelle vous utilisez un vecteur au lieu de la liste est parce qu'il y en a beaucoup
Lorsque le threading, le vecteur est sûr, tandis que la liste est dangereuse), ce conteneur vectoriel est le noyau de la classe d'observateurs, et il existe trois autres méthodes: la méthode d'attache est d'ajouter un objet d'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.
Implémentation du code du mode observateur
Public Abstract Classe Sujet {Vector Private <Observer> Obs = new Vector <OBSERVER> (); public void addObserver (Observer Obs) {this.obs.add (obs); } public void DelObserver (Observer Obs) {this.obs.remove (obs); } Protected void notifyObserver () {for (Observer o: obs) {o.update (); }} public abstract void doSomething (); } La classe publique Concretsubject étend le sujet {public void dosomething () {System.out.println ("Retourné par l'événement Observer"); this.notifyObserver (); }} Public Interface Observer {public void Update (); } classe publique ConcreteObserver1 implémente Observer {public void Update () {System.out.println ("Observer 1 reçoit le message et le traite."); }} classe publique ConcreteObserver2 implémente Observer {public void Update () {System.out.println ("Observer 2 reçoit le message et le traite."); }} classe publique Client {public static void main (String [] args) {sujet sub = new CONCRETESUBject (); sub.addobserver (new ConcreteObserver1 ()); // ajouter Observer1 sub.AddObserver (new ConcreteObserver2 ()); // ajouter Observer2 sub.doSomething (); }} Résultats en cours d'exécution
L'événement Observer est inversé et l'observateur 1 reçoit les informations et les traite.
Observer 2 reçoit les informations et les traite.
Grâce aux résultats en cours d'exécution, nous pouvons voir que nous appelons uniquement la méthode du sujet, mais les méthodes pertinentes des deux observateurs sont appelées en même temps. Si vous regardez attentivement le code, c'est en fait très simple. Ce n'est rien de plus que lorsque vous associez la classe d'observateurs dans la classe de sujets et traversez la méthode de mise à jour de l'observateur dans la méthode de dosage.
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.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.