Tipurile Observer / Observable furnizează un protocol prin care un număr arbitrar de obiecte observator observator primește notificări
Orice modificări sau evenimente legate de un număr arbitrar de obiecte Observabile. Obiectul Observabil este produs din subclasa Observabilă, astfel încât să puteți păstra o listă de obiecte Observer notificate despre modificările obiectului Observer. Toate obiectele "observator" incluse în listă ar trebui să implementeze interfața Observer. Când au loc schimbări cu obiectul observat, merită
vayuschie atenție, sau în cazul unor evenimente care sunt de interes pentru Observer, metoda se numește notifyObservers obiectul observabil, care se referă la metoda de actualizare pentru fiecare dintre obiectele Observer. Metoda de actualizare a interfeței Observant arată astfel:
public abstract void update (observabil obj, obiect arg)
Metoda este apelată atunci când obiectul Observabil este de a spune observatorilor despre o schimbare sau un eveniment. Parametrul arg permite transferul unui obiect arbitrar care conține o descriere a schimbării sau evenimentului în obiectul Observer.
Mecanismul Observer / Observator a fost conceput cu așteptarea universalității. Fiecare clasă Observabilă determină când și în ce condiții trebuie să fie apelată metoda de actualizare a obiectului Observer.
clasa observabil implementeaza metode pentru menținerea unei liste de obiecte de observatori pentru a stabili un pavilion de informare cu privire la schimbarea obiectului, precum și pentru a apela metoda actualiza oricare dintre obiecte Observer. Pentru a menține o listă de obiecte Observer, utilizați următoarele metode:
public sincronizat void addObserver (Observer o)
Adaugă un argument de tip Observer în lista obiectelor observatorului. public sincronizat void deleteObserver (Observer o)
Șterge argumentul o de tip Observer din lista obiectelor observatorului. public sincronizat void deleteObservers ()
Elimină toate obiectele Observer din lista de vizionări. public sincronizat int countObservers ()
Returnează numărul obiectelor observatorului.
Următoarele metode notifică obiectelor Observer cu privire la schimbările care au avut loc:
public sincronizat void notifyObservers (obiect arg)
Notifică toate obiectele Observer că ceva sa întâmplat cu obiectul observat și apoi resetează flag-ul de schimbare a obiectului. Pentru fiecare obiect observator inclus în listă se numește metoda de actualizare a acestuia, al cărui prim parametru este obiectul Observer, iar al doilea este arg.
public void notifyObservers ()
Exemplul de mai jos arată modul în care protocolul Observer / Obspect poate fi utilizat pentru a monitoriza utilizatorii înregistrați în sistem. Mai întâi, definiți clasa Utilizatori care extinde Observabil:
utilizatorii din clasa publică se extind vizibil
hashtable privat loggedIn = nou Hashtable ();
public void login (Nume șir, parolă String)
// metoda ridică o excepție BadUserException dacă (! passwordValid (nume, parolă)
aruncați noul BadUserException (nume);
UserState state = UserState nou (nume); loggedInput (nume, stare); setChanged ();
virul public public (statul UserState) Obiectul Utilizatori conține o listă de utilizatori activi și pentru fiecare dintre ele afișează obiectul UserState. Când cineva de la utilizator se conectează sau se închide în jos, atunci toate obiectele Observer transferat UserState obiect. Metoda notifyObservers trimite mesaje către observatori, numai în cazul schimbării stării obiectului observat, așa că trebuie să numim, de asemenea, metoda setChanged pentru utilizatori, diferite notifyObservers nu nimic. Mai mult decât atât metoda setChanged, există două metode pentru schimbarea drapelului de stat cu: clearChanged mărcile Observabile obiectul ca imutabil și hasChanged returnează o valoare steag Boolean. Mai jos este prezentat modul în care implementarea actualizării obiectului Observer, care monitorizează în mod constant compoziția utilizatorilor înregistrați, poate să arate: clasa publica Eye implements Observer ochiul public (utilizatori) public void update (Utilizatori observabili, Object which State) dacă (utilizatorii! = vizionează) arunca noua IllegalArgumentException (); UserState state = (UserState) whichState; addUser (stare); // adăugați la listă removeUser (state); // eliminați din listă Fiecare obiect Eye urmărește un anumit obiect utilizator. Atunci când un utilizator intră sau iese, obiectul Eye este notificat, deoarece constructorul său se numește addObserver metodă pentru obiectul de utilizare, în care obiectul ochi este specificat ca obiect al unui observator. Când este apelată metoda de actualizare, verificați corectitudinea parametrilor și modificați informațiile de ieșire, în funcție de faptul că utilizatorul a intrat în sistem sau a plecat. Se efectuează verificarea a ceea ce se întâmplă cu obiectul UserState, în acest caz simplu. Cu toate acestea, se poate evita - pentru a face acest lucru, în loc de obiectul UserState în sine, treceți un obiect shell care descrie ce se întâmplă cu cine. Această opțiune pare mai clară și ușurează adăugarea de funcții noi fără a rupe codul existent. Mecanismul Observer / Obsable este oarecum similar mecanismului de asteptare / notificare pentru firele descrise pe pagina. Cu toate acestea, acesta are mai multa flexibilitate si mai putine restrictii. Mecanismul de debit asigură faptul că accesul sincron protejează programul de efectele nedorite de multitasking. Mecanismul de monitorizare face posibilă organizarea între participanți a oricărei conexiuni care nu depinde de fluxurile utilizate. Ambele mecanisme furnizează un furnizor de informații (observabil și notificarea obiectului de notificare) și utilizatorul acestuia (Observatorul și obiectul care așteaptă așteptarea), cu toate acestea acestea satisfac nevoi diferite. Utilizați așteptați / notificați când mecanismul trebuie să țină cont de specificul firelor și de observator / observabil pentru cazuri mai generale. Creați o implementare a interfeței atribuite, în care observatorul / observatorul Se utilizează pentru a notifica observatorilor despre schimbările care apar cu obiectele.Articole similare