Observables en Java
J'essaie de comprendre l'Observateur et l'Observable.
Voici un exemple que j'essaie de comprendre:
public class IntegerDataBag extends Observable implements Iterable<Integer> {
private ArrayList<Integer> list= new ArrayList<Integer>();
public void add(Integer i){
list.add(i);
setChanged();
notifyObservers();
}
public Iterator<Integer> iterator(){
return list.iterator();
}
public Integer remove (int index){
if (index< list.size()){
Integer i = list.remove(index);
setChanged();
notifyObservers();
return i;
}
return null;
}
}
public class IntegerAdder implements Observer {
private IntegerDataBag bag;
public IntegerAdder(IntegerDataBag bag) {
this.bag = bag;
bag.addObserver(this);
}
public void update(Observable o, Object arg) {
if (o == bag) {
System.out.println("The contents of the IntegerDataBag have changed");
}
}
}
- La
bag.addObserver()
peuvent être effectuées uniquement parce queIntegerDataBag
s'étendObservable
? - Où est cet observateur être ajouter? Ce qui est créé et où?
- Quelle est la différence entre
setChanged()
etnotifyObservers()
? - Je ne comprends pas le
update
méthode; ce qui nearg
? Pourquoi ai-je besoin de vérifier queo==bag
? Pourquoi aurais-je mettre à jour un autre observable? - Pourquoi j'ai besoin de cet observateur de toute façon?
C'est l'un des rares modèles qui ne peut être mieux compris si l'on vous vient à point à vous vraiment faut l'utiliser dans votre projet.
Comme dans MVC par exemple. Donner ce code d'essayer: emilmont.net/...
Comme dans MVC par exemple. Donner ce code d'essayer: emilmont.net/...
OriginalL'auteur Numerator | 2011-09-01
Vous devez vous connecter pour publier un commentaire.
addObserver
est une méthode dans laObservable
classe abstraite. Voir Observables dans la documentation de Java.Observable
.notifyObservers
ne fera rien jusqu'à ce quesetChanged
est réglé.Observer
est une commune modèle de conception. L'exemple habituel est quand vous avez un Modèle et les Vues multiples. Chaque point de Vue est un Observateur sur le Modèle; si le Modèle change, les points de Vue mis à jour.Poulsen, Observable est pas est une classe abstraite (dans le JDK).
Vous avez raison, c'est effectivement normal/classe concrète. Comme cet article, les états, ce qui diffère de la mise en œuvre d'autres modèles de conception qui s'appuient sur des interfaces/asbtract classes: javapractices.com/topic/TopicAction.do?Id=156
Ses pas abstraite, mais vous devez créer un héritées de la classe à utiliser protégé setChanged méthode
OriginalL'auteur
Prenons un exemple pratique pour le modèle Observateur: Twitter. Avec Twitter, nous pouvons suivre certaines personnes à d'autres et de lire tout ce qu'ils affichent en quasi temps réel.
Chaque utilisateur de twitter est observables. Vous pouvez ajouter vous-même comme un "listener" ("Suiveur") et la lecture de ses posts. Chaque utilisateur de twitter va faire un "informer Disciples" (
notifyObservers
).Ici, nous faisons la même chose. La classe
IntegerDataBag
a la capacité à informer les autres classes à chaque fois qu'une valeur est ajouté ou supprimé de son sac interne. Tout d'instance (qui implémenteObserver
) peuvent s'inscrire à unIntegerDataBag
et de recevoir des messages par le biais de la méthode de rappel (update
).En bref, nous n'suivantes:
IntegerAdder
) ajoute un observables (IntegerDataBag
)Espère que cette courte description de l'aide dans la compréhension de ce modèle.
publier/souscrire est un semblable motif: un éditeur, c'est comme un fait observable, un abonné comme un observateur. Et un autre exemple pratique: on peut s'abonner à un journal et l'éditeur enverra le papier jusqu'à ce que vous annuliez votre abonnement.
Et ce qui est de la différence entre les Observables/Observateur et Publis/Abonné modèle?
OriginalL'auteur
Correct,
Observable
est une classe qui a laaddObserver()
méthode.La
Observer
classe contient uneList
ouVector
(dans le JDK source) deObservable
objets.C'est là où il est stocké.
La
setChanged()
marque juste leObservable
est changé.Le
notifyObservers()
appelle simplement la tous les observateurs qu'il a sur la liste deupdate()
(passage d'un objet modifié à l'Observateur) que si lesetChanged
est définie sur true.La
update()
méthode indique laObserver
qu'il doit mettre à jour basée sur le changement deobj
qu'il reçoit. Ceci est appelé par lenotifyObservers()
deObservable
.Pour créer un
Listener
pour l'événement piloté par le scénario, c'est à dire si vous souhaitez être informé dans le changement de vos objets observés, puis Observateur est nécessaire.Lire: GoF - Modèle observateur.
OriginalL'auteur
Oui.
Dans le Observables liées classe, votre classe est l'extension.
Il est appelé lorsque l'état d'un objet observé a changé.
L'argument est le paramètre passé à nofityObserver.
Vous n'avez pas besoin de vérifier quoi que ce soit.
C'est un très utile motif de conception. Jetez un oeil à wikipedia l'article.
EDIT:
J'ai raté le point :
setChanged() marque un objet de signalisation qu'elle a changé. notifyObservers est responsable pour réveiller tous les observateurs l'écoute de l'objet observé.
OriginalL'auteur
Oui, le
addObserver
méthode est implémentée dansObservable
.L'observateur est ajouté à une liste de observateurs de ce qui est déclaré dans
Observable
comme privés, de sorte qu'il n'est pas visible dans votre sous-classe.Lorsque vous appelez
notifyObservers()
sans appelersetChanged()
, pas de notifications de prendre place.Un
Observer
pouvez regarder de multiplesObservables
. En examinant le premier paramètre de laupdate
méthode, vous pouvez déterminer quel observateur est de vous informer de quelque chose.À tout moment vous voulez une classe pour envoyer des événements à d'autres classes, mais vous ne voulez pas une dépendance directe de cette classe sur ses observateurs.
OriginalL'auteur
En réponse à vos points.
Oui, vous avez raison
L'observateur est ajoutée à une liste maintenue dans l'objet observé
Vous devez appeler setChanged() avant de vous en informer les observateurs, sinon ils ne savent pas que l'objet a changé. Une fois que vous appelez notifyObservers(), Tous les obvserers sont informés du changement. Si vous n'appelez pas setChanged tout d'abord, votre observateurs ne serez pas averti.
arg est quelque chose que vous aimeriez transmettre aux Observateurs lorsque vous appelez notifyObservers(arg);
OriginalL'auteur
L'observateur est similaire à la notion d'auditeurs. L'objet, qui est d'être écouté, tient un registre de tous ses auditeurs. Par exemple, un suivi de stock de classe peut permettre aux objets d'écouter pour un certain événement, telles que le niveau de stock de tomber en dessous du niveau d'avertissement.
De l'observateur, du point de vue:
Appel
subscribe()
ouaddEventListener()
ou similaires. L'observateur est alors "notifié" lorsque l'événement se produit, généralement au moyen de l'appel d'une fonction dans l'observateur (la fonction de gestionnaire d'événement).de l'observable du point de vue:
Objets qui souhaitent observer l'objet observé enregistrer leurs intérêts par l'appel de la
subscribe()
ouaddEventListener()
comme ci-dessus. Les observables ajoute donc ces observateurs à un tableau, une liste, ou une autre structure de données.Une fois que l'événement se produit, les auditeurs sont notifiées par l'appel de la fonction de gestionnaire d'événement dans la observateurs de la classe.
OriginalL'auteur
La méthode update() est appelée par le Observables. Cette méthode est appelée par l'appel de notifyObservers(), qui itterates creux de tous les Observateurs et les appels de mise à jour. Cela informe l'Observateur que l'objet qu'ils regardent a été modifié et un certain type d'action peut être effectuée.
Les arguments de l'objet est tout ce que vous voulez qu'il soit, il peut être null aswell mais il peut être utilisé pour informer les observateurs de ce type de mise à jour a eu lieu.
OriginalL'auteur
Oui, c'est l'ensemble de point.
Il ajoute
IntegerAdder
à la liste des classes d'observerIntegerDatabag
pour les changements. À partir de maintenant, si un changement se produit surIntegerDataBag
, il devra en aviserIntegerAdder
via lenotifyObservers()
méthode, qui déclenchera sesupdate()
méthode.notifyObservers()
appelle laupdate()
méthode de chaque observateur de votre observables, et est utilisé pour transmettre les infos à cette méthode. Comme poursetChanged()
, il marque votre objet est "changé" de sorte que lehasChanged()
méthode retournera vrai... Il est utilisé pour surveiller les modifications de votre observables en classe.La
update()
méthode est héritée de la mise en œuvre de l'observateur de l'interface que Vous avez à mettre en œuvre. LeObject arg
est un argument facultatif que vous pouvez passer à la méthode vianotifyObservers()
.Depuis un observateur peut "observer" plus d'un "observable", vous devez vérifier que c'est vraiment
IntegerDatabag
qui a déclenchéupdate()
, donco==bag
.Vous avez besoin de l'observateur pour suivre
IntegerDataBag
pour les changements. Dans votre cas, vous imprimez un message dans la console lors deIntegerDatabag
est modifié. Le but de l'Observateur/Observable modèle est spécifiquement pour surveiller les changements sur des objets spécifiques, et ensuite mettre à jour le programme sur la base des changements.OriginalL'auteur