Cet article vous présente le modèle d'observateur du modèle de conception Java de trafic, qui définit une relation de dépendance un-à-plusieurs entre les objets de sorte que lorsque chaque objet change d'état. Ce qui suit est une introduction au modèle d'observateur des modèles de conception Java à travers des diagrammes de classes et des exemples de codes. Les amis intéressés devraient y jeter un œil ensemble
Définition : définir une relation de dépendance un-à-plusieurs entre les objets, donc. que chaque fois qu'un objet change d'état, tous les objets qui en dépendent sont notifiés et mis à jour automatiquement.
Type : Modèle de classe comportementale
Diagramme de classes :
Il existe souvent une telle exigence dans les systèmes logiciels : si un objet Lorsque le changements d'état, certains objets qui y sont liés doivent également apporter les modifications correspondantes. Par exemple, nous voulons concevoir une fonction de menu contextuel. Tant que vous cliquez avec le bouton droit de la souris dans la zone valide du logiciel, un menu apparaîtra. Pour un autre exemple, nous voulons concevoir un déploiement automatique ; fonction, tout comme lors du développement d'Eclipse, tant que le fichier est modifié, Eclipse déploiera automatiquement les fichiers modifiés sur le serveur. Ces deux fonctions ont une similitude, c'est-à-dire qu'un objet doit surveiller l'autre objet à tout moment et que dès que son état change, il doit prendre les actions correspondantes. En fait, il existe de nombreuses solutions permettant d’y parvenir, mais il ne fait aucun doute que l’utilisation du mode observateur est un choix courant.
Structure du mode observateur
Dans le mode observateur le plus basique, les quatre rôles suivants sont inclus :
Observé : comme vous pouvez le voir sur le diagramme de classes, la classe possède un conteneur Vector utilisé pour stocker les objets observateurs (la raison pour laquelle Vector est utilisé à la place de List est que lors d'opérations multithread, Vector (est sûr , alors que List n'est pas sécurisé), ce conteneur Vector est le cœur de la classe observateur, et il existe trois autres méthodes : la méthode attach consiste à ajouter un objet observateur à ce conteneur ; la méthode detach consiste à le supprimer du conteneur. à l'objet observateur ; la méthode notify consiste à appeler la méthode correspondante de l'objet observateur dans l'ordre. Ce rôle peut être une interface, une classe abstraite ou une classe concrète. Parce qu'il est souvent mélangé à d'autres modèles, les classes abstraites sont souvent utilisées.
Observateur : Le rôle d'observateur est généralement une interface, qui n'a qu'une seule méthode de mise à jour. Cette méthode sera déclenchée et appelée lorsque l'état de l'observateur change.
Observateur spécifique : ce rôle est utilisé pour faciliter l'expansion, et une logique métier spécifique peut être définie dans ce rôle.
Observateur spécifique : Une implémentation spécifique de l'interface d'observateur. Dans ce rôle, la logique à traiter lorsque l'état de l'objet observé change sera définie.
Implémentation du code de modèle d'observateur
abstract class Subject { private Vector<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(); } class ConcreteSubject extends Subject { public void doSomething(){ System.out.println("被观察者事件反生"); this.notifyObserver(); } } interface Observer { public void update(); } class ConcreteObserver1 implements Observer { public void update() { System.out.println("观察者1收到信息,并进行处理。"); } } class ConcreteObserver2 implements Observer { public void update() { System.out.println("观察者2收到信息,并进行处理。"); } } public class Client { public static void main(String[] args){ Subject sub = new ConcreteSubject(); sub.addObserver(new ConcreteObserver1()); //添加观察者1 sub.addObserver(new ConcreteObserver2()); //添加观察者2 sub.doSomething(); } }
Résultats d'exécution
L'événement observé est reflété
L'observateur 1 reçoit l'information et la traite.
L'Observateur 2 reçoit les informations et les traite.
Vous pouvez voir d'après les résultats en cours d'exécution que nous avons uniquement appelé la méthode Sujet, mais en même temps, les méthodes liées des deux observateurs ont été appelées en même temps. Regardez le code de plus près. C'est en fait très simple. Il s'agit simplement d'associer la classe Observer à la classe Subject et de parcourir la méthode de mise à jour de l'Observateur dans la méthode doSomething.
Avantages du modèle d'observateur
Il existe une légère relation entre l'observateur et l'observé, et sont abstraitement couplés, ce qui facilite l'extension des deux.
Le mode observateur est un mécanisme de déclenchement couramment utilisé. Il forme une chaîne de déclenchement et traite tour à tour les méthodes de chaque observateur. Mais en même temps, c'est aussi un défaut du mode observateur. Puisqu'il s'agit d'un déclencheur en chaîne, lorsqu'il y a de nombreux observateurs, les problèmes de performances sont plus préoccupants. De plus, dans la structure en chaîne, il est plus facile que des erreurs de référence circulaires se produisent, provoquant le gel du système.
Résumé
En langage Java, il existe une interface Observer, et sa classe d'implémentation Observable, pour les rôles d'observateurs sont souvent réalisés. Nous pouvons vérifier l'utilisation de ces deux classes dans la documentation de l'API jdk.
Les amis qui ont fait du développement VC++, JavaScript DOM ou AWT sont émerveillés par leur traitement des événements. Après avoir compris le modèle d'observateur, vous aurez une certaine compréhension des principes du mécanisme de traitement des événements. Si vous souhaitez concevoir la fonction d'un mécanisme de traitement déclencheur d'événements, l'utilisation du modèle d'observateur est un bon choix. Le DEM (Delegation Event Model) de traitement d'événements dans AWT est implémenté à l'aide du modèle d'observateur.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!